2016-07-26 73 views
2

我遇到了MySQL的ROLLUP並處理生成的NULL的問題。 IFNULL/COALESCE函數適用於普通列,但在與日期函數一起使用時似乎會失效。例子如下:通過彙總,聚合/ ifnull和日期函數MySQL組

SELECT 
    YEAR(date_time) AS Year, 
    count(x) AS Count 
FROM mytable 
GROUP BY year WITH ROLLUP 

返回(如預期)

Year Count 
---- ----- 
2015 3 
2016 2 
NULL 5 

當我查詢非日期列(VARCHAR,例如),我能夠處理NULL值通過使用IFNULL或COALESCE功能用字符串替換NULL值。但是,當我將相同的邏輯應用於上述查詢時,似乎不起作用。

SELECT 
    COALESCE(YEAR(date_time), 'moo') AS Year, 
    count(x) AS Count 
FROM mytable 
GROUP BY year WITH ROLLUP 

SELECT 
    IFNULL(YEAR(date_time), 'moo') AS 'year', 
    count(x) AS Count 
FROM mytable 
GROUP BY year WITH ROLLUP 

回報

Year Count 
---- ----- 
2015 3 
2016 2 
NULL 5 

,而不是預期的

Year Count 
---- ----- 
2015 3 
2016 2 
moo 5 

任何意見,建議?

+0

這個問題對我來說毫無意義,因爲你實際上並沒有在滾動任何東西,因爲沒有聚合函數與'GROUP BY'一起使用。 –

+0

僅僅因爲我已經將查詢減少到了最小值以得到我的問題的核心 –

+0

然後,您應該顯示一個有代表性的示例。上面給出的內容沒有任何意義,因爲沒有彙總。 –

回答

1

如果您試圖在總彙總計算期間生成NULL(與原始數據中的NULL相對),那麼您指的是錯誤的NULL。如果是這樣,這可能是你想要做的:

SELECT 
    IFNULL(m.year, 'moo') 
FROM 
    (SELECT 
     YEAR(date_time) AS 'year' 
    FROM 
     mytable 
    GROUP BY 
     year 
    WITH ROLLUP) m 

這是sqlfiddle

+0

這絕對解決了我的問題。我不明白的是爲什麼相同的查詢適用於不同類型的列? (即對於varchar,這工作得很好:'SELECT COALESCE(category,'moo')FROM categories GROUP BY category WITH ROLLUP;') –

+0

差異不是列類型,而是派生的與原始值的分組。在上面的註釋中的「varchar query」中,您是按'category'分組的,而不是在您的'SELECT'中派生的值。見[這個sqlfiddle](http://sqlfiddle.com/#!9/378b70/7)。 –

+0

我想我明白你在說什麼,特別是在原始表中有NULL值的情況下,但我更多地提到了ROLLUP生成的NULL。另外,還有不止一個問題。查看這個[sqlfiddle](http://sqlfiddle.com/#!9/7c794b/3)中的4對查詢。前兩對錶明無論您是GROUP BY列名還是在您創建的別名SELECT,無論列的類型如何。最後兩對錶明,如果您需要在GROUP BY語句內部操作列數據,COALESCE將不起作用(不管類型如何) –