GROUP BY你都不會!ROLLUP,CUBE,GROUPPING詳解

来源:https://www.cnblogs.com/injet/archive/2019/03/08/10493930.html
-Advertisement-
Play Games

Group By Group By 誰不會啊?這不是最簡單的嗎?越是簡單的東西,我們越會忽略掉他,因為我們不願意再去深入瞭解它。 "1 小時 SQL 極速入門(一)" "1 小時 SQL 極速入門(二)" "1 小時 SQL 極速入門(三)——Oracle 分析函數" "SQL 高級查詢——(層次化 ...


Group By

Group By 誰不會啊?這不是最簡單的嗎?越是簡單的東西,我們越會忽略掉他,因為我們不願意再去深入瞭解它。
1 小時 SQL 極速入門(一)
1 小時 SQL 極速入門(二)
1 小時 SQL 極速入門(三)——Oracle 分析函數
SQL 高級查詢——(層次化查詢,遞歸)

今天就帶大家瞭解一下Group By 的新用法吧。

ROLL UP

ROLL UP 搭配 GROUP BY 使用,可以為每一個分組返回一個小計行,為所有分組返回一個總計行。

直接看例子,我們有以下數據表,包含工廠列,班組列,數量列三列。

表結構.png

當向 ROLLUP 傳入一列時,會得到一個總計行。

SELECT factory,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory)
ORDER BY factory

結果:

ROLLUP1.PNG

當向 ROLLUP 傳遞兩列時,將會按照這兩列進行分組,同時按照第一列的分組結果返回小計行。我們同時傳入工廠和部門看一下。

SELECT factory,department,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory, department)
ORDER BY factory

結果:

ROLLUP2.png

可以看到對每一個工廠都有一個小計行,最後對所有的有一個總計行。也可以這樣理解

如果 ROLLUP(A,B)則先對 A,B進行 GROUP BY,之後對 A 進行 GROUP BY,最後對全表 GROUP BY。

如果 ROLLUP(A,B,C)則先對 A,B,C進行 GROUP BY ,然後對 A,B進行GROUP BY,再對 A 進行GROUP BY,最後對全表進行 GROUP BY.

CUBE

CUBE 和 ROLLUP 對參數的處理是不同的,我們可以這樣理解。

如果 CUBE(A,B)則先對 A,B 進行 GROUP BY,之後對 A 進行 GROUP BY,然後對 B 進行 GROUP BY,最後對全表進行 GROUP BY.

如果 CUBE(A,B,C)則先對 A,B,C 進行 GROUP BY,之後對 A,B ,之後對A,C ,之後對 B,C 之後對 A,之後對 B,之後對 C,最後對全表GROUP BY

看一個簡單的例子:

SELECT factory,department,
  SUM(quantity)
FROM production
GROUP BY CUBE(factory, department)
ORDER BY factory,department;

結果:

CUBE.png

可以看出來首先對 FACTORY,DEPARTMENT進行分組彙總,然後對FACTORY 分組彙總,之後對 DEPARTMENT 分組彙總,最後有一行全表彙總。

GROUPING

GROUPING()函數只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,如果此列不為空則返回0,如果為空則返回1.

我們用第一個ROLLUP例子舉例

SELECT GROUPING(factory),
  factory,
  department,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory, department)
ORDER BY factory,
  department;

結果:

GROUPING.png

看到,最後一行的 FACTORY 為空,所以 GROUPING()返回 1.也可以與CUBE結合使用,方法是一樣的。

GROUPING SETS

GROUPING SETS 與 CUBE 有點類似,CUBE是對參數進行自由組合進行分組。GROUPING SETS則對每個參數分別進行分組,GROUPING SETS(A,B)就代表先按照 A 分組,再按照 B分組。

SELECT factory,
  department,
  SUM(quantity)
FROM production
GROUP BY GROUPING SETS(factory, department)
ORDER BY factory,
  department

結果:

GROUPINGSETS.PNG

可以看出來結果是按照工廠和部門分別分組彙總的。

GROUPING_ID()

GROUPING_ID()配合GROUPING()函數使用,GROUPING_ID(A,B)的值由GROUPING(A)與GROUPING(B)的值決定,如果GROUPING(A)為1,GROUPING(B)為0,則GROUPING_ID(A,B)的值為 10,十進位的 3.

SELECT factory,
  department,
  GROUPING(factory),
  GROUPING(department),
  GROUPING_ID(factory,department),
  SUM(quantity)
FROM production
GROUP BY CUBE(factory, department)
ORDER BY factory,
  department;

結果:

GROUPINGID.png

有了GROUPING_ID列,我們就可以使用 HAVING 字句來對查詢結果進行過濾。選擇GROUPING_ID=0的就表示 FACTORY,DEPARTMENT兩列都不為空。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 處理字元串時,利用字元型函數的嵌套組合是非常有效的,試分析一道考題: create table customers(cust_name varchar2(20)); insert into customers values('Lex De Hann'); insert into customers ...
  • 最近在學習伺服器方面的知識,找到了這款功能強大的建站集成軟體包——xampp。但是在開資料庫伺服器的時候,出現了這種情況。一直在Attemptng to start MySQL service...... 後面才發現是我電腦上安裝了mysql的軟體, 嘻嘻~~~就是這個了,如果你電腦已經安裝了mys ...
  • SELECT REPLACE(unix_timestamp(current_timestamp(3)),'.',''); ...
  • 一個作業報錯,報錯信息如下,從錯誤信息根本看不出為什麼出錯,手工運行作業又成功了。一時不清楚什麼原因導致作業出錯。 MessageExecuted as user: NT SERVICE\SQLSERVERAGENT. ...eration. [SQLSTATE 01003] (Message 81... ...
  • 個人理解的方法有三種 方法一:通過系統表master..spt_values獲取 1、獲取連續的日 2、獲取連續的月 3、獲取連續的年 master..spt_values原理: 通過number來實現年月日的加減,因為number值最大是2047,所以只能連續加2047。 如圖:結束時間是'202 ...
  • 數據類型和操作數據表 2.1 MySQL類型之整型 2.2 MySQL數據類型之浮點型 2.3 日期時間型 DATE 1支持時間:1000年1月1日~9999年12月31日 DATETIME 3 支持時間:1000年1月1日0時0秒~9999年12月31日23時59分59秒 TIMESTAMP 3 ...
  • 創建用戶:create user 'oracle'@'localhost' identified by 'password'; MySQL 8以上:alter user 'root'@'localhost' identified with mysql_native_password by 'newp ...
  • 一:下載 32位 https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-win32.zip 64位 https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-winx64.zi... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...