2014-04-15 198 views
0

在MySQL後,訂購查詢,我需要在年/月遞減波紋管責令結果:嘗試使用ROLLUP

Month   Mod1 Mod2 Mod3 
Jan/2013  5  4  2 
Jan/2013  1  5  3 
Total   6  9  5 
Feb/2013  6  3  2 
Feb/2013  2  1  4 
Total   8  4  6 
Mar/2014  6  3  2 
Mar/2014  2  1  4 
Total   8  4  6 

排序方式年/月遞減應該是:

Month   Mod1 Mod2 Mod3 
Mar/2014  6  3  2 
Mar/2014  2  1  4 
Total   8  4  6 
Feb/2013  6  3  2 
Feb/2013  2  1  4 
Total   8  4  6 
Jan/2013  5  4  2 
Jan/2013  1  5  3 
Total   6  9  5 

查詢是:

SELECT 
    month, 
    year, 
    SUM(IF(mod = 1, 1, 0)) AS mod1, 
    SUM(IF(mod = 2, 1, 0)) AS mod2, 
    SUM(IF(mod = 3, 1, 0)) AS mod3 
FROM 
    DW_RM_Log 
WHERE 
    ... 
GROUP BY 
    year, month 
WITH ROLLUP 
HAVING year IS NOT NULL AND month IS NOT NULL 

我不能只在末尾插入ORDER BY年,月DESC,因爲我得到以下錯誤:「SQLSTATE [HY000] :一般錯誤:1221 CUBE/ROLLUP和ORDER BY'的錯誤使用。有什麼建議麼?

回答

1

在MySQL中,group by做排序。雖然隱含排序現在已被棄用,但您仍然可以安全地進行顯式排序。以下應該做你想要西隧:

SELECT month, year, 
     SUM(mod = 1) AS mod1, SUM(mod = 2) AS mod2, SUM(mod = 3) AS mod3 
FROM DW_RM_Log 
WHERE ... 
GROUP BY year DESC, month DESC WITH ROLLUP 
HAVING year IS NOT NULL AND month IS NOT NULL; 

請注意,我還簡化了sum()條件。在MySQL中,您可以僅使用條件本身,而不包括if()

+0

完美。謝謝! – Danilo

0

要回答你關於一個WITH ROLLUP查詢堂堂一個ORDER BY具體問題,你只需要它顛覆一個子查詢:

SELECT * 
FROM 
(
SELECT 
    month, 
    year, 
    SUM(IF(mod = 1, 1, 0)) AS mod1, 
    SUM(IF(mod = 2, 1, 0)) AS mod2, 
    SUM(IF(mod = 3, 1, 0)) AS mod3 
FROM 
    DW_RM_Log 
WHERE 
    ... 
GROUP BY 
    year, month 
WITH ROLLUP 
HAVING year IS NOT NULL AND month IS NOT NULL 
) a 
ORDER BY year, month DESC 
+0

它的工作原理,但我得到每個月中的「總」行... – Danilo