【自記】SQL 中 GROUPING 和 GROUPING SETS 語句的案例說明

????????我們用一個生活中的例子來理解,比如你開了家小超市,想統計「銷售額」,但需要從多個角度看(比如按 “日期 + 商品”、“僅日期”、“僅商品”、“整體總銷售額”)。

假設你的銷售數據長這樣(簡化版):

日期商品銷售額
2023-10-01可樂100
2023-10-01薯片80
2023-10-02可樂120
2023-10-02薯片90

你想同時得到 4 種統計結果:

  1. 按「日期 + 商品」統計(最明細的維度);
  2. 僅按「日期」統計(每天總銷售額);
  3. 僅按「商品」統計(每種商品總銷售額);
  4. 不按任何維度(整體總銷售額)。

不用 GROUPING SETS 的話,你需要寫 4 個查詢,再合并:

-- 1. 日期+商品
SELECT 日期, 商品, SUM(銷售額) FROM 銷售表 GROUP BY 日期, 商品
UNION ALL
-- 2. 僅日期
SELECT 日期, 'ALL' 商品, SUM(銷售額) FROM 銷售表 GROUP BY 日期
UNION ALL
-- 3. 僅商品
SELECT 'ALL' 日期, 商品, SUM(銷售額) FROM 銷售表 GROUP BY 商品
UNION ALL
-- 4. 整體匯總
SELECT 'ALL' 日期, 'ALL' 商品, SUM(銷售額) FROM 銷售表

用 GROUPING SETS 的話,1 條查詢搞定:

SELECT -- 用GROUPING判斷列是否參與分組,不參與就顯示'ALL'IF(GROUPING(日期) = 0, 日期, 'ALL') AS 日期,IF(GROUPING(商品) = 0, 商品, 'ALL') AS 商品,SUM(銷售額) AS 總銷售額
FROM 銷售表
-- 一次性指定所有要統計的維度組合
GROUP BY 日期, 商品
GROUPING SETS ((日期, 商品),  -- 對應需求1:日期+商品(日期),        -- 對應需求2:僅日期(商品),        -- 對應需求3:僅商品()             -- 對應需求4:不分組(整體匯總)
)

最終結果長這樣:

日期商品總銷售額
2023-10-01可樂100-- 日期 + 商品維度
2023-10-01薯片80-- 日期 + 商品維度
2023-10-02可樂120-- 日期 + 商品維度
2023-10-02薯片90-- 日期 + 商品維度
2023-10-01ALL180-- 僅日期維度(100+80)
2023-10-02ALL210-- 僅日期維度(120+90)
ALL可樂220-- 僅商品維度(100+120)
ALL薯片170-- 僅商品維度(80+90)
ALLALL390-- 整體匯總(180+210 或 220+170)

核心點總結:

  • GROUPING SETS(...):括號里寫多個 “維度組合”,一次查詢得到所有組合的統計結果(代替多次GROUP BY+UNION ALL)。
  • GROUPING(列名):判斷這一列是否在當前行的 “維度組合” 中。如果在(參與了分組),返回 0,顯示實際值;如果不在(是匯總行),返回 1,用 'ALL' 標記,方便區分。

————————————

????????我們用一個更貼近實際業務的例子來說明:假設你有一張「訂單表」,需要統計不同維度的銷量,同時保留一個固定的分組字段(比如「月份」),并穿插普通查詢字段和GROUPING處理的字段,看看它們的區別。

場景設定

訂單表orders結構(簡化):

月份(month)地區(region)產品(product)銷量(sales)
2023-09華北手機100
2023-09華北電腦50
2023-09華南手機80
2023-10華北手機120
2023-10華南電腦60

需求

統計每個月的銷量,同時按以下維度組合分析:

  1. 月份 + 地區 + 產品(最明細)
  2. 月份 + 地區(不區分產品)
  3. 月份 + 產品(不區分地區)
  4. 月份(不區分地區和產品)

要求結果中:

  • 保留「月份」作為固定顯示的普通字段;
  • 「地區」和「產品」用GROUPING處理,不參與分組時顯示'ALL'
  • 計算總銷量。

SQL 查詢(包含普通字段和 GROUPING 字段)

SELECT -- 普通字段:月份(始終在GROUP BY中,直接顯示實際值)month,-- GROUPING處理的字段:地區(是否參與分組動態顯示)IF(GROUPING(region) = 0, region, 'ALL') AS region,-- GROUPING處理的字段:產品(是否參與分組動態顯示)IF(GROUPING(product) = 0, product, 'ALL') AS product,-- 聚合字段:總銷量SUM(sales) AS total_sales
FROM orders
-- 固定按月份分組,同時用GROUPING SETS定義地區和產品的組合
GROUP BY month,
GROUPING SETS ((region, product),  -- 組合1:月份+地區+產品(region),           -- 組合2:月份+地區(無產品)(product),          -- 組合3:月份+產品(無地區)()                  -- 組合4:僅月份(無地區和產品)
)
ORDER BY month, region, product;

查詢結果

monthregionproducttotal_sales
2023-09華北手機100-- 組合 1:月份 + 地區 + 產品
2023-09華北電腦50-- 組合 1:月份 + 地區 + 產品
2023-09華北ALL150-- 組合 2:月份 + 地區(匯總該地區所有產品)
2023-09華南手機80-- 組合 1:月份 + 地區 + 產品
2023-09華南ALL80-- 組合 2:月份 + 地區(匯總該地區所有產品)
2023-09ALL手機180-- 組合 3:月份 + 產品(匯總所有地區該產品)
2023-09ALL電腦50-- 組合 3:月份 + 產品(匯總所有地區該產品)
2023-09ALLALL230-- 組合 4:僅月份(匯總該月所有銷量)
2023-10華北手機120-- 組合 1:月份 + 地區 + 產品
2023-10華北ALL120-- 組合 2:月份 + 地區(匯總該地區所有產品)
2023-10華南電腦60-- 組合 1:月份 + 地區 + 產品
2023-10華南ALL60-- 組合 2:月份 + 地區(匯總該地區所有產品)
2023-10ALL手機120-- 組合 3:月份 + 產品(匯總所有地區該產品)
2023-10ALL電腦60-- 組合 3:月份 + 產品(匯總所有地區該產品)
2023-10ALLALL180-- 組合 4:僅月份(匯總該月所有銷量)

普通字段 vs GROUPING 處理的字段:核心區別

  1. 普通字段(如month

    • 必須出現在GROUP BY中(否則 SQL 會報錯,因為非聚合字段必須參與分組)。
    • 其值是「固定分組維度」,在所有結果行中都顯示實際值(如2023-092023-10),不會被替換為'ALL'
    • 作用:作為所有統計維度的 “基礎錨點”(比如這里所有統計都基于 “月份” 展開)。
  2. GROUPING 處理的字段(如regionproduct

    • 不一定在所有分組組合中出現(由GROUPING SETS控制)。
    • 其值是「動態分組維度」:當參與當前分組時顯示實際值(如華北手機),不參與時顯示'ALL'(表示該維度被匯總)。
    • 作用:靈活切換不同維度的統計視角,同時用'ALL'清晰標記 “當前行是該維度的匯總結果”。

????????簡單說:普通字段是 “固定不變的分組錨點”,GROUPING 處理的字段是 “可開關的動態維度”,前者值固定,后者值隨分組組合動態變化(實際值或匯總標記)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922219.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言第五課:if、else 、if else if else 控制語句

C語言第五課&#xff1a;if、else 、if else if else 控制語句if else 、if else if else 聯合使用編程快速學習平臺if else 、if else if else 聯合使用 代碼示列 #include <stdio.h> int main(){//設置中文編碼輸出到控制臺system("chcp 65001");//今天星…

七彩喜智慧養老:用科技溫暖晚年,讓關愛永不掉線

“當銀發潮遇見科技力&#xff0c;養老方式正在發生一場靜悄悄的變革。”你有沒有想過&#xff1a;當父母年邁獨居時&#xff0c;如何確保他們的安全&#xff1f;當老人突然摔倒&#xff0c;如何第一時間獲得救助&#xff1f;當慢性病需要長期管理&#xff0c;如何避免頻繁奔波…

window顯示驅動開發—為頭裝載和專用監視器生成自定義合成器應用(二)

顯示相關的 API 的比較 API用途和目標受眾DisplayInformation用于檢索 CoreWindow 的呈現和布局屬性。HdmiDisplayInformation用于枚舉和設置受限模式集的僅限 Xbox 的 API。 高度專用于 Xbox 媒體應用方案。DisplayMonitor用于查詢物理監視器設備的屬性。 不公開有關操作系統…

Linux 高性能 I/O 事件通知機制的核心系統調用—— `epoll_ctl`

epoll 是 Linux 上處理大量文件描述符 I/O 事件的高效模型&#xff0c;而 epoll_ctl 則是你用來指揮 epoll 實例&#xff08;epoll instance&#xff09;的“遙控器”&#xff0c;負責向它添加、修改或刪除需要監視的文件描述符&#xff08;FD&#xff09;及其感興趣的事件。1.…

mysql 必須在逗號分隔字符串和JSON字段之間二選一,怎么選

如果必須在逗號分隔字符串和JSON字段之間二選一&#xff0c;那么 JSON字段是明顯更好的選擇。以下是詳細的對比分析&#xff1a;對比結論&#xff08;直接看這里&#xff09;方面JSON字段逗號分隔字符串勝出方查詢能力? 豐富的JSON函數支持? 只能使用LIKE模糊查詢JSON數據驗證…

DPI和DIP的區別

DPI 和 DIP 是兩個在計算機圖形和移動開發領域常見的術語&#xff0c;它們都與屏幕顯示和尺寸有關&#xff0c;但含義和用途不同。 DPI (Dots Per Inch) 定義&#xff1a;DPI 的全稱是 Dots Per Inch&#xff0c;即每英寸點數。它是一個衡量物理密度的單位&#xff0c;表示在…

數據幫助我們理解未知世界

主持人 尼古拉安根&#xff1a; 大家好&#xff0c;我是挪威南方財富基金首席執行官尼古拉安根。今天非常榮幸能與大衛斯皮格爾哈爾特爵士對話。坦率地說&#xff0c;他不僅是世界上最優秀的統計學家之一&#xff0c;也是我見過的最佳風險溝通者。他撰寫了大量優秀著作&#xf…

在使用git的很多操作是保持工作區干凈

這是一條鐵律下面是錯誤操作&#xff1a;自己明明寫完了代碼&#xff0c;想要提交。此時你的工作區長這樣你的提交順序是&#xff1a;git pull -> git commit -> git push但是現實往往不這樣&#xff0c;萬一拉下來的代碼和你當前工作區的代碼有沖突&#xff0c;你必須要…

通過語法推導樹快速求短語,簡單短語和句柄

第一步&#xff1a;寫出規范推導&#xff08;最右&#xff09;序列 規范推導就是最右推導。我們的目標是從起始符號 E 出發&#xff0c;通過每步替換最右邊的非終結符&#xff0c;最終得到句型 R(Pi)。 文法 G[E]: E :: RP | PP :: (E) | iR :: RP | RP* | P | P* 推導過程&…

智能學習輔助系統-部門管理開發

文章目錄準備工作工程搭建增刪改查查詢部門刪除部門新增部門修改部門查詢回顯修改數據日志技術準備工作 需求&#xff1a;部門管理的查詢、新增、修改、刪除 使用REST風格的URL&#xff1a; GET &#xff1a; 查詢POST &#xff1a;新增PUT &#xff1a; 修改DELETE &#x…

【圖解】idea中快速查找maven沖突

現象 今天啟動項目時&#xff0c;總是以下報錯&#xff0c;并退出SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/F:/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.13.3/log4j-slf4j-impl-2.13.3.jar!/org/slf4j/im…

LightGBM、XGBoost和CatBoost自定義損失函數和評估指標

LightGBM、XGBoost和CatBoost自定義損失函數和評估指標函數&#xff08;縮放誤差&#xff09;數學原理損失函數定義梯度計算評估指標LightGBM實現自定義損失函數自定義評估指標使用方式XGBoost實現自定義損失函數自定義評估指標使用方式CatBoost實現自定義損失函數自定義評估指…

2025-09-08升級問題記錄: 升級SDK從Android11到Android12

將 Android 工程的 targetSdkVersion 從 30 &#xff08;Android 11&#xff09;升級到 31&#xff08;Android 12&#xff09;需要關注一些重要的行為變更和適配點。 主要適配要點&#xff1a; 適配類別關鍵變更點適配緊迫性簡要說明組件導出屬性聲明了 Intent Filter 的組件…

利用OpenCV實現模板與多個對象匹配

代碼實現&#xff1a;import cv2 import numpy as npimg_rgb cv2.imread(mobanpipei.jpg) img_gray cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template cv2.imread(jianto.jpg, flags0) h, w template.shape[:2]# 讀取圖像# # 順時針旋轉 90 度&#xff08;k1&#xff0…

OS28.【Linux】自制簡單的Shell的修bug記錄

目錄 1.問題代碼 2.排查 前期檢查 查找是誰修改了environ[0] 使用gdb下斷點 查看后續的影響 分析出問題的split_commandline函數 3.反思 4.正確代碼 5.結論 6.除此之外...... ★提示: 此bug非常隱蔽,不仔細分析很難查出問題,非常鍛煉調試能力! 1.問題代碼 #includ…

Debian 系統上安裝與配置 MediaMTX

&#x1f3af; 在 Debian 系統上安裝與配置 MediaMTX&#xff08;原 rtsp-simple-server&#xff09;&#xff1a;打造輕量級流媒體服務器 作者&#xff1a;遠在太平洋 環境&#xff1a;Debian 10/11/12 | Ubuntu 可參考 關鍵詞&#xff1a;MediaMTX、rtsp-simple-server、RTSP…

分布式專題——10.4 ShardingSphere-Proxy服務端分庫分表

1 為什么要有服務端分庫分表&#xff1f; ShardingSphere-Proxy 是 ShardingSphere 提供的服務端分庫分表工具&#xff0c;定位是“透明化的數據庫代理”。 它模擬 MySQL 或 PostgreSQL 的數據庫服務&#xff0c;應用程序&#xff08;Application&#xff09;只需像訪問單個數據…

Mysql相關的面試題1

什么是聚集索引&#xff08;聚簇索引&#xff09;&#xff1f;什么是二級索引&#xff08;非聚簇索引&#xff09;&#xff1f; 聚集索引就是葉子節點關聯行數據的索引&#xff0c;二級索引就是葉子節點關聯主鍵的索引&#xff0c;聚集索引必須有且僅有一個&#xff0c;二級索引…

電涌保護器:為現代生活筑起一道隱形防雷網

何為電涌保護器&#xff1f;電涌保護器&#xff08;Surge Protective Device&#xff0c;簡稱SPD&#xff09;主要用于控制信號系統&#xff0c;保護電氣電子設備信號線路免受雷電電磁脈沖、感應過電壓、操作過電壓的影響&#xff0c;廣泛應用于工控、消防、安防監控、交通、電…

【uniapp微信小程序】掃普通鏈接二維碼打開小程序

需求&#xff1a;用戶A保存自己的邀請碼海報&#xff0c;用戶B掃描該普通連接二維碼&#xff0c;打開微信小程序&#xff0c;并且攜帶用戶A的邀請碼信息&#xff0c;用戶B登錄時&#xff0c;跟用戶A關聯&#xff0c;成為用戶A的下級。 tips&#xff1a;保存海報到手機相冊可以參…