2016-07-07 83 views
1

我在查詢的正確結果時遇到問題
我正在查詢獲取有多少用戶已在相應月份註冊的查詢。到目前爲止,我想出了下面的查詢,讓我得到這一結果,但不顯示的月份裏沒有用戶註冊

包括NULL個月

SELECT 
YEAR(c.created_at) as 'YEAR', 
(CASE WHEN MONTH(c.created_at)=1 THEN 'Jan' 
    WHEN (MONTH(c.created_at)=2) THEN 'Feb' 
    WHEN (MONTH(c.created_at)=3) THEN 'Mar' 
    WHEN (MONTH(c.created_at)=4) THEN 'Apr' 
    WHEN (MONTH(c.created_at)=5) THEN 'May' 
    WHEN (MONTH(c.created_at)=6) THEN 'Jun' 
    WHEN (MONTH(c.created_at)=7) THEN 'Jul' 
    WHEN (MONTH(c.created_at)=8) THEN 'Aug' 
    WHEN (MONTH(c.created_at)=9) THEN 'Sep' 
    WHEN (MONTH(c.created_at)=10) THEN 'Oct' 
    WHEN (MONTH(c.created_at)=11) THEN 'Nov' 
    WHEN (MONTH(c.created_at)=12) THEN 'Dec' 
END) 
as 'MONTH', 
COUNT(c.id) as Total 
FROM customers as c 
WHERE YEAR(c.created_at) = 2016 
GROUP BY c.id, MONTH(c.created_at) 
ORDER BY YEAR(c.created_at), MONTH(c.created_at), Total ASC 


結果:

+------+-------+-------+ 
| YEAR | MONTH | Total | 
+------+-------+-------+ 
| 2016 | Feb |  1 | 
| 2016 | Apr |  1 | 
| 2016 | May |  1 | 
| 2016 | Jul |  1 | 
+------+-------+-------+ 
4 rows in set (0.00 sec) 

我希望它是這樣

+------+-------+-------+ 
| YEAR | MONTH | Total | 
+------+-------+-------+ 
| 2016 | Jan |  0 | 
| 2016 | Feb |  1 | 
| 2016 | Mar |  0 | 
| 2016 | Apr |  1 | 
| 2016 | May |  1 | 
| 2016 | Jun |  0 | 
| 2016 | Jul |  1 | 
| 2016 | Aug |  0 | 
| 2016 | Sep |  0 | 
| 2016 | Oct |  0 | 
| 2016 | Nov |  0 | 
| 2016 | Dec |  0 | 
+------+-------+-------+ 

回答

0

請嘗試像這樣

使用SUM而不是COUNT。無論如何,你將顯示零或一個。

SELECT 
    YEAR(c.created_at) as 'YEAR', 
    (CASE WHEN MONTH(c.created_at)=1 THEN 'Jan' 
     WHEN (MONTH(c.created_at)=2) THEN 'Feb' 
     WHEN (MONTH(c.created_at)=3) THEN 'Mar' 
     WHEN (MONTH(c.created_at)=4) THEN 'Apr' 
     WHEN (MONTH(c.created_at)=5) THEN 'May' 
     WHEN (MONTH(c.created_at)=6) THEN 'Jun' 
     WHEN (MONTH(c.created_at)=7) THEN 'Jul' 
     WHEN (MONTH(c.created_at)=8) THEN 'Aug' 
     WHEN (MONTH(c.created_at)=9) THEN 'Sep' 
     WHEN (MONTH(c.created_at)=10) THEN 'Oct' 
     WHEN (MONTH(c.created_at)=11) THEN 'Nov' 
     WHEN (MONTH(c.created_at)=12) THEN 'Dec' 
    END) AS 'MONTH', 
    SUM (CASE WHEN c.id IS NOT NULL THEN 1 ELSE 0 END) as Total 
FROM customers as c 
WHERE YEAR(c.created_at) = 2016 
GROUP BY c.id, MONTH(c.created_at) 
ORDER BY YEAR(c.created_at), MONTH(c.created_at), Total ASC 
0

您可以創建一個12行的表外連接對

0

我想出了這個解決方案,我與我的情況效果很好。
我使用下面的查詢

SELECT 
YEAR(b.created_at) as 'YEAR', 
COUNT(CASE WHEN MONTH(b.created_at)=1 THEN b.id END) as Jan, 
COUNT(CASE WHEN MONTH(b.created_at)=2 THEN b.id END) as Feb, 
COUNT(CASE WHEN MONTH(b.created_at)=3 THEN b.id END) as Mar, 
COUNT(CASE WHEN MONTH(b.created_at)=4 THEN b.id END) as Apr, 
COUNT(CASE WHEN MONTH(b.created_at)=5 THEN b.id END) as May, 
COUNT(CASE WHEN MONTH(b.created_at)=6 THEN b.id END) as Jun, 
COUNT(CASE WHEN MONTH(b.created_at)=7 THEN b.id END) as Jul, 
COUNT(CASE WHEN MONTH(b.created_at)=8 THEN b.id END) as Aug, 
COUNT(CASE WHEN MONTH(b.created_at)=9 THEN b.id END) as Sep, 
COUNT(CASE WHEN MONTH(b.created_at)=10 THEN b.id END) as Oct, 
COUNT(CASE WHEN MONTH(b.created_at)=11 THEN b.id END) as Nov, 
COUNT(CASE WHEN MONTH(b.created_at)=12 THEN b.id END) as 'Dec', 
COUNT(b.id) as Total 
FROM customers as b 
GROUP BY YEAR(b.created_at) 
ORDER BY YEAR(b.created_at) ASC 

產生本輸出

+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+ 
| YEAR | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Total | 
+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+ 
| 2015 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |  2 | 
| 2016 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |  4 | 
+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+ 
2 rows in set (0.00 sec) 

從技術上解決了這個問題,因爲它包括零個月創造了月舉足輕重的表。