MySql的分組函數(shù) ROLLUP 語法及完美解決方案
- Oracle:
GROUP BY ROLLUP(字段A) - MySQL:
GROUP BY 字段A WITH ROLLUP
解決方案1:使用 WITH ROLLUP和 GROUPING()
SELECT
CASE
WHEN GROUPING(C_JXDM) = 1 THEN 2
ELSE 0
END AS N_GROUPING,
-- GROUPING(C_JXDM) C_JXDM_GROUPING,
-- GROUPING(C_PXLB) C_PXLB_GROUPING,
COALESCE(C_JXDM, '合計') AS C_JXDM,
COALESCE(C_PXLB, '') AS C_PXLB,
COUNT(*) AS N_CNT
FROM (
-- 模擬你的數(shù)據(jù)表
SELECT 'name1' AS name, '103001' AS C_JXDM, '1' AS C_PXLB
UNION ALL
SELECT 'name2', '103001', '1'
UNION ALL
SELECT 'name3', '103001', '2'
UNION ALL
SELECT 'name4', '103001', '3'
UNION ALL
SELECT 'name5', '103001', '3'
UNION ALL
SELECT 'name6', '112001', '1'
UNION ALL
SELECT 'name7', '112001', '1'
UNION ALL
SELECT 'name8', '138001', '2'
) AS t
GROUP BY C_JXDM, C_PXLB WITH ROLLUP
HAVING GROUPING(C_PXLB) = 0 OR (GROUPING(C_JXDM) = 1 AND GROUPING(C_PXLB) = 1)
ORDER BY
GROUPING(C_JXDM) ASC,
C_JXDM,
GROUPING(C_PXLB) ASC,
C_PXLB;N_GROUPING C_JXDM C_PXLB N_CNT 0 103001 1 2 0 103001 2 1 0 103001 3 2 0 112001 1 2 0 138001 2 1 2 合計 8
解決方案2:更簡潔的寫法(MySQL 8.0+)
WITH sample_data AS (
SELECT 'name1' AS name, '103001' AS C_JXDM, '1' AS C_PXLB
UNION ALL SELECT 'name2', '103001', '1'
UNION ALL SELECT 'name3', '103001', '2'
UNION ALL SELECT 'name4', '103001', '3'
UNION ALL SELECT 'name5', '103001', '3'
UNION ALL SELECT 'name6', '112001', '1'
UNION ALL SELECT 'name7', '112001', '1'
UNION ALL SELECT 'name8', '138001', '2'
)
SELECT
CASE
WHEN GROUPING(C_JXDM) = 1 THEN 2
WHEN GROUPING(C_PXLB) = 0 THEN 0
ELSE 1
END AS N_GROUPING,
-- GROUPING(C_JXDM) C_JXDM_GROUPING,
-- GROUPING(C_PXLB) C_PXLB_GROUPING,
COALESCE(C_JXDM, '合計') AS C_JXDM,
COALESCE(C_PXLB, '') AS C_PXLB,
COUNT(*) AS N_CNT
FROM sample_data
GROUP BY C_JXDM, C_PXLB WITH ROLLUP
-- HAVING GROUPING(C_PXLB) = 0 OR (GROUPING(C_JXDM) = 1 AND GROUPING(C_PXLB) = 1)
ORDER BY
GROUPING(C_JXDM),
C_JXDM,
GROUPING(C_PXLB),
C_PXLB;N_GROUPING C_JXDM C_PXLB N_CNT 0 103001 1 2 0 103001 2 1 0 103001 3 2 1 103001 5 0 112001 1 2 1 112001 2 0 138001 2 1 1 138001 1 2 合計 8
加上“HAVING GROUPING(C_PXLB) = 0 OR (GROUPING(C_JXDM) = 1 AND GROUPING(C_PXLB) = 1)” 就只列出明細和總計行
解決方案3:如果只需要明細和總計(2級匯總)
WITH sample_data AS (
SELECT 'name1' AS name, '103001' AS C_JXDM, '1' AS C_PXLB
UNION ALL SELECT 'name2', '103001', '1'
UNION ALL SELECT 'name3', '103001', '2'
UNION ALL SELECT 'name4', '103001', '3'
UNION ALL SELECT 'name5', '103001', '3'
UNION ALL SELECT 'name6', '112001', '1'
UNION ALL SELECT 'name7', '112001', '1'
UNION ALL SELECT 'name8', '138001', '2'
)
SELECT
GROUPING(C_JXDM) + GROUPING(C_PXLB) AS N_GROUPING,
IFNULL(C_JXDM, '合計') AS C_JXDM,
IFNULL(C_PXLB, '') AS C_PXLB,
COUNT(*) AS N_CNT
FROM sample_data
GROUP BY C_JXDM, C_PXLB WITH ROLLUP
HAVING (GROUPING(C_JXDM) = 0 AND GROUPING(C_PXLB) = 0) -- 明細行
OR (GROUPING(C_JXDM) = 1 AND GROUPING(C_PXLB) = 1) -- 總計行
ORDER BY GROUPING(C_JXDM), C_JXDM, GROUPING(C_PXLB), C_PXLB;
N_GROUPING C_JXDM C_PXLB N_CNT
0 103001 1 2
0 103001 2 1
0 103001 3 2
0 112001 1 2
0 138001 2 1
2 合計 8解釋:
- N_GROUPING 值:
0:表示明細行(既有C_JXDM分組,也有C_PXLB分組)2:表示總計行(兩個維度都匯總了)
- GROUPING() 函數(shù):
- 返回0表示該列參與分組
- 返回1表示該列是ROLLUP匯總的結(jié)果
- COALESCE/IFNULL:用于處理ROLLUP產(chǎn)生的NULL值
- HAVING 子句:
- 過濾掉中間的匯總行(如每個C_JXDM的小計),只保留明細和最終總計
如果你需要不同級別的匯總(如小計+總計),可以調(diào)整HAVING子句的條件。
到此這篇關于MySql的分組函數(shù) ROLLUP 語法的文章就介紹到這了,更多相關mysql分組函數(shù)rollup語法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
簡單了解mysql InnoDB MyISAM相關區(qū)別
這篇文章主要介紹了簡單了解mysql InnoDB MyISAM相關區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)
這篇文章主要介紹了安裝登錄mysql-8.0.19-winx64的教程圖解,非常適合新手學習參考,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Windows 10 與 MySQL 5.5 安裝使用及免安裝使用詳細教程(圖文)
本文介紹Windows 10環(huán)境下,MySQL 5.5的安裝使用及免安裝使用教程,本文提供了資源下載及相關問題解決方案,非常不錯,需要的朋友參考下2017-07-07
MySQL?8.0.31中使用MySQL?Workbench提示配置文件錯誤信息解決方案
這篇文章主要介紹了MySQL?8.0.31中使用MySQL?Workbench提示配置文件錯誤信息,本文給大家分享完美解決方案,文中補充介紹了MySQL?Workbench部分出錯及可能解決方案,需要的朋友可以參考下2023-01-01

