最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySql的分組函數(shù) ROLLUP 語法及完美解決方案

 更新時間:2026年03月03日 10:30:09   作者:xixi_666  
這篇文章總結(jié)了在MySQL中如何使用`GROUP BY`和`ROLLUP`來實現(xiàn)分組匯總,通過`WITH ROLLUP`和`GROUPING()`函數(shù),可以靈活地控制匯總級別,并使用`HAVING`子句來過濾掉中間匯總行,只保留明細和最終總計行,感興趣的朋友跟隨小編一起看看吧
  • Oracle: GROUP BY ROLLUP(字段A)
  • MySQL: GROUP BY 字段A WITH ROLLUP

解決方案1:使用 WITH ROLLUPGROUPING()

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Linux下mysql5.6.24(二進制)自動安裝腳本

    Linux下mysql5.6.24(二進制)自動安裝腳本

    這篇文章主要為大家詳細介紹了Linux環(huán)境下mysql5.6.24二進制自動安裝腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • MySQL服務器的SSD性能問題分析和測試詳解

    MySQL服務器的SSD性能問題分析和測試詳解

    這篇文章主要給大家介紹了關于MySQL服務器的SSD性能問題分析和測試的相關資料,文中圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • mySQL之關鍵字的執(zhí)行優(yōu)先級講解

    mySQL之關鍵字的執(zhí)行優(yōu)先級講解

    這篇文章主要介紹了mySQL之關鍵字的執(zhí)行優(yōu)先級講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • MySql delimiter的作用是什么

    MySql delimiter的作用是什么

    其實就是告訴mysql解釋器,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了。默認情況下,delimiter是分號;。在命令行客戶端中,如果有一行命令以分號結(jié)束,那么回車后,mysql將會執(zhí)行該命令。
    2010-09-09
  • 簡單了解mysql InnoDB MyISAM相關區(qū)別

    簡單了解mysql InnoDB MyISAM相關區(qū)別

    這篇文章主要介紹了簡單了解mysql InnoDB MyISAM相關區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)

    小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)

    這篇文章主要介紹了安裝登錄mysql-8.0.19-winx64的教程圖解,非常適合新手學習參考,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • MySQL 聯(lián)合查詢的使用教程

    MySQL 聯(lián)合查詢的使用教程

    聯(lián)合查詢(JOIN)通過將兩個或更多表根據(jù)一定條件連接起來,從而形成一個虛擬的結(jié)果集,本文將詳細介紹 MySQL 聯(lián)合查詢的使用,幫助你掌握不同類型的聯(lián)接及其應用場景,感興趣的朋友一起看看吧
    2025-04-04
  • Windows 10 與 MySQL 5.5 安裝使用及免安裝使用詳細教程(圖文)

    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?8.0.31中使用MySQL?Workbench提示配置文件錯誤信息,本文給大家分享完美解決方案,文中補充介紹了MySQL?Workbench部分出錯及可能解決方案,需要的朋友可以參考下
    2023-01-01
  • mysql隨機查詢10條數(shù)據(jù)的三種方法

    mysql隨機查詢10條數(shù)據(jù)的三種方法

    本文主要介紹了mysql隨機查詢10條數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09

最新評論

清苑县| 吉安县| 张家港市| 弥渡县| 绥德县| 富平县| 海晏县| 安龙县| 冷水江市| 濮阳县| 鄂伦春自治旗| 淳化县| 通山县| 永清县| 伊宁县| 淄博市| 景宁| 葵青区| 邛崃市| 通河县| 镇安县| 昌乐县| 舟曲县| 山东省| 共和县| 辽阳县| 色达县| 万全县| 阳谷县| 安国市| 厦门市| 揭东县| 扎赉特旗| 思茅市| 东光县| 永安市| 湘潭市| 谢通门县| 绩溪县| 平原县| 高州市|