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)” 就只列出明細(xì)和總計行
解決方案3:如果只需要明細(xì)和總計(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) -- 明細(xì)行
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:表示明細(xì)行(既有C_JXDM分組,也有C_PXLB分組)2:表示總計行(兩個維度都匯總了)
- GROUPING() 函數(shù):
- 返回0表示該列參與分組
- 返回1表示該列是ROLLUP匯總的結(jié)果
- COALESCE/IFNULL:用于處理ROLLUP產(chǎn)生的NULL值
- HAVING 子句:
- 過濾掉中間的匯總行(如每個C_JXDM的小計),只保留明細(xì)和最終總計
如果你需要不同級別的匯總(如小計+總計),可以調(diào)整HAVING子句的條件。
到此這篇關(guān)于MySql的分組函數(shù) ROLLUP 語法的文章就介紹到這了,更多相關(guān)mysql分組函數(shù)rollup語法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下mysql5.6.24(二進(jìn)制)自動安裝腳本
這篇文章主要為大家詳細(xì)介紹了Linux環(huán)境下mysql5.6.24二進(jìn)制自動安裝腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
mySQL之關(guān)鍵字的執(zhí)行優(yōu)先級講解
這篇文章主要介紹了mySQL之關(guān)鍵字的執(zhí)行優(yōu)先級講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
簡單了解mysql InnoDB MyISAM相關(guān)區(qū)別
這篇文章主要介紹了簡單了解mysql InnoDB MyISAM相關(guān)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)
這篇文章主要介紹了安裝登錄mysql-8.0.19-winx64的教程圖解,非常適合新手學(xué)習(xí)參考,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Windows 10 與 MySQL 5.5 安裝使用及免安裝使用詳細(xì)教程(圖文)
本文介紹Windows 10環(huán)境下,MySQL 5.5的安裝使用及免安裝使用教程,本文提供了資源下載及相關(guān)問題解決方案,非常不錯,需要的朋友參考下2017-07-07
MySQL?8.0.31中使用MySQL?Workbench提示配置文件錯誤信息解決方案
這篇文章主要介紹了MySQL?8.0.31中使用MySQL?Workbench提示配置文件錯誤信息,本文給大家分享完美解決方案,文中補(bǔ)充介紹了MySQL?Workbench部分出錯及可能解決方案,需要的朋友可以參考下2023-01-01
mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法
本文主要介紹了mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09

