2014-11-25 133 views
0

我原來的查詢如下:包括NULL結果爲0,在MySQL

SELECT COUNT(*) AS count, YEAR(created_at) AS "year", MONTH(created_at) AS "month" 
FROM quotes WHERE 
(YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) 
OR YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) -1) 
AND status_id = 1 
GROUP BY YEAR(created_at), MONTH(created_at) DESC 

該查詢基本檢索COUNT本月與上月持平,當有對任何一個月沒有結果,除了正常工作。

我有兩個類似的查詢,做相同的幾周和幾年除外。

我試過使用COALESCEIFNULL,但它似乎沒有包含NULL的結果。

SELECT IFNULL(COUNT(*), 0) AS count, YEAR(created_at) AS "year", MONTH(created_at) AS "month" 
FROM quotes 
WHERE 
    (YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) OR YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) -1) 
    AND status_id = 1 
GROUP BY YEAR(created_at), MONTH(created_at) DESC 

實際結果

count | year | month 
----------------------- 
    1 | 2014 | 11 

預期結果

count | year | month 
----------------------- 
    1 | 2014 | 11 
    0 | 2014 | 10 

SQL Fiddle

+0

你嘗試移動'你的聚集函數裏面IFNULL'? – 2014-11-25 13:37:09

+0

@ jbarker2160 nope,不是100%確定你的建議,但我有一個想法,並會試一試 – martincarlin87 2014-11-25 13:40:36

+0

你不能選擇不存在的東西。您必須以某種方式創建或模擬丟失的數據。 – Strawberry 2014-11-25 13:46:47

回答

0

你需要使用一個單獨的數據集你想要的幾個月瑟即你的SQLfiddle只是對Quotes上的行進行分組,並且因此顯示幾個月內沒有出現在結果集中的聚合行。

嘗試Creating a temporary table與你想要的月份,然後做一個簡單的外部連接來選擇出現的任何引號。

0

只需在SUM函數內部移動IFNULL,就像建議的註釋一樣,這還不夠。 您只能按可用的值進行分組。如果2014 - 10年沒有參賽作品,您將無法獲得任何印刷品。 否則你會看到每個可能的組合。

注意:Where子句僅限制結果,它對顯示的內容沒有影響。選擇doens't「知道」它必須顯示10個月。becuas ethere在那裏沒有價值。

我不知道你想達到什麼目的,但個人在這種情況下,我只是在程序中打印0時根本沒有匹配結果。

0

在最簡單的...

 
SELECT x.month 
    , COUNT(q.id) total 
    FROM (SELECT 10 month UNION SELECT 11) x 
    LEFT 
    JOIN quotes q 
    ON MONTH(created_at) = month 
GROUP 
    BY month;