2017-06-19 139 views
0

我有像下面的表格格式。如何使用mysql查詢獲取每週報告?

Customer_ID Result C_Date 
1    2  2017-06-19 15:49:00 
1    3  2017-06-20 15:49:00 
1    3  2017-06-21 15:49:00 
2    1  2017-06-15 15:49:00 
3    2  2017-06-15 15:49:00 
1    2  2017-06-19 19:49:00 
1    3  2017-06-21 23:49:00 

我需要獲取Customer_ID的所有記錄爲1和本週結果。 例如

Customer_ID Day  Total(COUNT) 
1   Sunday 0 
1   Monday 2 
1   Tuesday 1 
1   Wednesday 1 
1   Thursday 0 
1   Friday 0 
1   Saturday 0 

我需要這種類型的結果在MySQL查詢。

+0

值得一讀https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users – RiggsFolly

+1

你有沒有試圖寫一個查詢呢? – RiggsFolly

+1

請閱讀[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic) 和[如何提出一個好問題](http://stackoverflow.com/help/how-to - 問) 和[完美的問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) 以及如何創建[最小,完整和可驗證示例] (http://stackoverflow.com/help/mcve) ** SO不是**免費的編碼服務___我們嘗試修復您的代碼,我們不寫你的代碼____ – RiggsFolly

回答

0

您可以使用WEEKOFYEAR()函數:

http://www.w3resource.com/mysql/date-and-time-functions/mysql-weekofyear-function.php

所以,像做WHERE WEEKOFYEAR(C_DATE)= WEEKOFYEAR(NOW())

我懷疑這將是可怕慢。也許更好的方法是查找當前周的開始和結束日期,然後使用它們對C_Date執行<和>。

米克

+0

需要本週的數據。 –

+1

你爲什麼不開始寫一個SELECT,讓我們看看你得到了什麼? – Mick

0

像這樣將返回指定的結果:

SELECT c.customer_id AS `Customer_ID` 
    , d.day   AS `Day` 
    , COUNT(1)  AS `Total(COUNT)` 
    FROM (SELECT 1 AS customer_id) c 
CROSS 
    JOIN (SELECT 1 AS `dow`, 'Sunday' AS `day` 
     UNION ALL SELECT 2, 'Monday' 
     UNION ALL SELECT 3, 'Tuesday' 
     UNION ALL SELECT 4, 'Wednesday' 
     UNION ALL SELECT 5, 'Thursday' 
     UNION ALL SELECT 6, 'Friday' 
     UNION ALL SELECT 7, 'Saturday' 
     ) d 
    LEFT 
    JOIN mytable t 
    ON t.customer_id = c.customer_id 
    AND t.c_date >= DATE(NOW()) + INTERVAL -7 DAY 
    AND t.c_date < DATE(NOW()) 
    AND DAYOFWEEK(t.c_date) = d.dow 
GROUP BY c.customer_id, d.dow 
ORDER BY c.customer_id, d.dow 

注:

我們需要返回七 「日」 的值(週日至週六一個行源),否則,當那天沒有行時,我們不能從表中返回當天的「零」計數。

我們需要定義「當前周」。上面的查詢使用當前日期,並減去七天。如果此查詢在星期三運行,我們將在星期三至星期二前七天收到。如果你的「本週」的定義比不同,則使用產生在報告期開始時的一個DATETIME值,而本報告期後的第一秒(代替DATE(NOW)) + INTERVAL -7 DAYDATE(NOW)))表達


隨訪

尋址評論:「只拿到週一的記錄,所有其他人都不對」

請明白這一點:StackOverflow上是查詢和代碼寫作服務。上述 答案圖示查詢模式的例子,滿足查詢需要克服的最大駝峯之一:

  • 返回零個計數行不存在

由於上面提到的答案(在說:)的那條線下面),我們需要一個「當前周」的實際規範。當「今日」是星期二時,這意味着什麼,'2017-06-20'。確定了哪些日期範圍?如果今天是星期五或星期天,這意味着什麼?

一旦我們有了定義,我們就可以編寫表達式,它將返回開始和結束日期值。

要另外一種方式,...把查詢的這個部分:

AND t.c_date >= DATE(NOW()) + INTERVAL -7 DAY 
    AND t.c_date < DATE(NOW()) 

並更換有這樣的事情:

AND t.c_date >= '2017-06-14' 
    AND t.c_date < '2017-06-21' 

或像這樣:

AND t.c_date >= '2017-06-18' 
    AND t.c_date < '2017-06-25' 

什麼日期文字可用於查詢返回th預期的結果?因此,查詢不是「只得到星期一的記錄,所有其他人都不對」[原文如此]。

我們可以使用一個簡單的SELECT語句來測試表達式。我們可以使用用戶定義的變量代替NOW()來測試NOW()的各種可能的值。例如:

SET @tday = '2017-06-21 12:34' ; 

SELECT DATE(@tday) - INTERVAL DAYOFWEEK(@tday)-1 DAY AS sd 
    , DATE(@tday) - INTERVAL DAYOFWEEK(@tday)-8 DAY AS ed 

一旦我們返回「開始」和範圍的「結束」的表達,我們可以利用那些在另一個查詢。像上面的一個...

AND t.c_date >= DATE(NOW()) - INTERVAL DAYOFWEEK(NOW())-1 DAY 
    AND t.c_date < DATE(NOW()) - INTERVAL DAYOFWEEK(NOW())-8 DAY 
+0

是的,你正確的...... –

+0

只得到星期一的記錄,所有其他人都不對 –