MySQL-with rollup函數運用

若是想在下面這個表下面添加一行 總計 數據行SQL代碼怎麼實現 而且根據9月金額進行城市降序 總計置於底部呢 html

MySQL提供了 group by with rollup 函數進行group by 字段的彙總函數

可是order by 互斥的不能同時用spa

第一步仍是是先計算各城市每一個月的金額3d

複製代碼
SELECT b.城市,SUM(IF(b.年月=201607,b.金額,NULL)) AS 7月金額,SUM(IF(b.年月=201608,b.金額,NULL)) AS 8月金額,SUM(IF(b.年月=201609,b.金額,NULL)) AS 9月金額
FROM (
    SELECT city AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金額
    FROM test_a03order AS a
    GROUP BY city,DATE_FORMAT(order_time,"%Y%m")
) AS b
GROUP BY b.城市
複製代碼

第二步咱們先用group by with rollup 函數添加針對字段的彙總code

複製代碼
SELECT b.城市,SUM(IF(b.年月=201607,b.金額,NULL)) AS 7月金額,SUM(IF(b.年月=201608,b.金額,NULL)) AS 8月金額,SUM(IF(b.年月=201609,b.金額,NULL)) AS 9月金額
FROM (
    SELECT city AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金額
    FROM test_a03order AS a
    GROUP BY city,DATE_FORMAT(order_time,"%Y%m")
) AS b
GROUP BY b.城市 WITH ROLLUP
複製代碼

這個記錄沒有出現總計兩個字,怎麼實現呢 繼續修改代碼 ifnull()函數htm

第三 添加總計字樣(有坑) ifnull()函數是將空字段另外命名blog

複製代碼
SELECT IFNULL(b.城市,"總計") AS 城市,SUM(IF(b.年月=201607,b.金額,NULL)) AS 7月金額,SUM(IF(b.年月=201608,b.金額,NULL)) AS 8月金額,SUM(IF(b.年月=201609,b.金額,NULL)) AS 9月金額
FROM (
    SELECT city AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金額
    FROM test_a03order AS a
    GROUP BY city,DATE_FORMAT(order_time,"%Y%m")
) AS b
GROUP BY b.城市 WITH ROLLUP
複製代碼

第四 擺脫掉坑 排序

爲何說有坑呢 若是ifnull()函數放在上面代碼位置 看似實現了總計的字樣  ifnull()是針對用了with rollup 函數總計這個位置出現空字段時候修改它爲總計字樣的,ci

若是城市這一列裏自己就含有沒有命名的城市呢 這一列就會出現多個總計字樣 所以咱們須要將ifnull()函數放到嵌套的子表裏 將空字段在子表裏面就預先改爲別名(不能是總計字樣)get

所以 使用2個ifnull()函數就不會有這樣的問題 結果是同樣的 

複製代碼
SELECT IFNULL(b.城市,"總計") AS 城市,SUM(IF(b.年月=201607,b.金額,NULL)) AS 7月金額,SUM(IF(b.年月=201608,b.金額,NULL)) AS 8月金額,SUM(IF(b.年月=201609,b.金額,NULL)) AS 9月金額
FROM (
    SELECT IFNULL(city,'空城市') AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金額
    FROM test_a03order AS a
    GROUP BY city,DATE_FORMAT(order_time,"%Y%m")
) AS b
GROUP BY b.城市 WITH ROLLUP
複製代碼

  第五 排序 

在這篇博客http://www.cnblogs.com/Mr-Cxy/p/5910291.html 提到了order by field()自定義排序函數 以下圖紅框所示有這樣一個默認的自定義排序規則

所以 若是想實現 根據9月金額進行城市降序 總計置於底部 效果 能夠把上面代碼當成一個子表嵌套 結合 order by field()自定義函數實現 

複製代碼
SELECT c.*
FROM (
    SELECT IFNULL(b.城市,"總計") AS 城市,SUM(IF(b.年月=201607,b.金額,NULL)) AS 7月金額,SUM(IF(b.年月=201608,b.金額,NULL)) AS 8月金額,SUM(IF(b.年月=201609,b.金額,NULL)) AS 9月金額
    FROM (
        SELECT IFNULL(city,'空城市') AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金額
        FROM test_a03order AS a
        GROUP BY city,DATE_FORMAT(order_time,"%Y%m")
    ) AS b
    GROUP BY b.城市 WITH ROLLUP
) AS c
ORDER BY FIELD(城市,'總計'),c.9月金額 DESC
複製代碼

 

相關文章
相關標籤/搜索