Oracle 中總計和小計使用的函數

来源:https://www.cnblogs.com/wxb2010/archive/2020/05/23/12941727.html
-Advertisement-
Play Games

@[TOC](總計和小計、逐行累計求和)### 一、總計和小計使用函數#### 1、rollupgroup by 我們都知道,是一個分組函數,用於針對某一列做分組操作。但是當它搭配其他的函數一起使用的時候,就像一對男女孩,撞出不一樣的火花。==rollup(欄位1,欄位2,.....) rollup ...



@[TOC](總計和小計、逐行累計求和)
### 一、總計和小計使用函數
#### 1、rollup
group by 我們都知道,是一個分組函數,用於針對某一列做分組操作。
但是當它搭配其他的函數一起使用的時候,就像一對男女孩,撞出不一樣的火花。
==rollup(欄位1,欄位2,.....)
rollup和group by一起使用,可以針對每一個分組返回一個小計行,以及為所有的分組返回一個總計行(一個欄位就是返回總計行,多個欄位就是返回每一個分組的一個小計行和一個總計行)==
實踐是檢驗真理的唯一標準,那我們來實踐一下,我們先來快速創建一個表。有多快,很快很快的那種。

```handlebars
CREATE TABLE EMP (
"EMPNO" NUMBER(4) NOT NULL ,
"ENAME" VARCHAR2(10 BYTE) ,
"JOB" VARCHAR2(9 BYTE) ,
"SAL" NUMBER(7,2) ,
"DEPTNO" NUMBER(2)
)
INSERT INTO "SCOTT"."EMP" VALUES ('1', '張三', '開發', '10000', '10');
INSERT INTO "SCOTT"."EMP" VALUES ('2', '李四', '運維', '6000', '20');
INSERT INTO "SCOTT"."EMP" VALUES ('3', '王五', '測試', '6000', '30');
INSERT INTO "SCOTT"."EMP" VALUES ('4', '麻子', '開發', '12000', '10');
```
==當我們的rollup裡面只有一個欄位的時候,就返回一個總計行==

```handlebars
select deptno,sum(sal) from emp
group by rollup(deptno);
查詢結果:
10 22000
20 6000
30 6000
34000
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523100648667.png)
==當我們傳遞兩個列欄位的時候,就會按照第一個欄位進行分組,返回一個小計行,最後返回一個總計行==

```handlebars
select ENAME,DEPTNO,sum(sal) from emp group by rollup(ENAME,DEPTNO);
李四 20 6000
李四 6000
麻子 10 12000
麻子 12000
王五 30 6000
王五 6000
張三 10 10000
張三 10000
34000

select ENAME,DEPTNO,sum(sal) from emp group by rollup(DEPTNO,ENAME);
麻子 10 12000
張三 10 10000
10 22000
李四 20 6000
20 6000
王五 30 6000
30 6000
34000
```
根據rollup()傳入的第一個欄位不同,返回的結果是不一樣的。我的理解是,rollup()傳遞多欄位的時候,會==先對多欄位進行分組,然後對第一個欄位進行分組==,比如上面的ename是第一個欄位,多欄位分組後就有四種,然後對第一欄位分組後還剩四種,並且返回一個小計行,最後返回一個總計行
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020052310123379.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dYQjUyMTEyMTgxMzE0,size_16,color_FFFFFF,t_70)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523101249222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dYQjUyMTEyMTgxMzE0,size_16,color_FFFFFF,t_70)
#### 2、cube
cube()傳遞一個欄位的時候,和rollup是一樣的結果

```handlebars
select DEPTNO,sum(sal) from emp group by cube(DEPTNO) order by deptno;
10 22000
20 6000
30 6000
34000
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523103405378.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dYQjUyMTEyMTgxMzE0,size_16,color_FFFFFF,t_70)
但是cube()傳遞多個欄位的時候,就和rollup()不一樣了,cube()對多欄位的處理是先對所有的多欄位進行分組,然後==對第一個欄位進行分組,再對第二個欄位進行分組,意思就是兩種分組合起來了==,從下麵的結果我們就可以看出來,比如第二個欄位是deptno,分組後會把相同的10做為一組,所以可以看到根據ename分組會產生一個小計行,再根據deptno分組後產生了一個小計行,最後返回一個總計行。就等於在rollup()的基礎上,我們多了幾行分組的結果

```handlebars
select ENAME,DEPTNO,sum(sal) from emp group by cube(ENAME,DEPTNO);
34000
10 22000
20 6000
30 6000
李四 6000
李四 20 6000
麻子 12000
麻子 10 12000
王五 6000
王五 30 6000
張三 10000
張三 10 10000

select ENAME,DEPTNO,sum(sal) from emp group by cube(DEPTNO,ENAME);
34000
李四 6000
麻子 12000
王五 6000
張三 10000
10 22000
麻子 10 12000
張三 10 10000
20 6000
李四 20 6000
30 6000
王五 30 6000
```

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523103747346.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dYQjUyMTEyMTgxMzE0,size_16,color_FFFFFF,t_70)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523104220398.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dYQjUyMTEyMTgxMzE0,size_16,color_FFFFFF,t_70)
#### 3、grouping
GROUPING函數可以接受一列,返回0或者1。==如果列值為空,那麼GROUPING()返回1;如果列值非空,那麼返回0==。GROUPING只能在使用ROLLUP或CUBE的查詢中使用。我的理解就是==用來填充使用rollup()和cube()產生的null值==

```handlebars
select grouping(deptno),DEPTNO,sum(sal) from emp group by rollup(DEPTNO) ;
0 10 22000
0 20 6000
0 30 6000
1 34000
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523105005605.png)
我們使用==decode函數或case when==來填充為null的值。
==DECODE(value,if 條件1,then 值1,if 條件2,then 值2,...,else 其他值)==

```handlebars
select decode(grouping(deptno),1,'總計',DEPTNO) deptno,sum(sal) from emp group by rollup(DEPTNO) ;
10 22000
20 6000
30 6000
總計 34000
```
!![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523105431244.png)
可以看到我們把第一次查詢結果中的null填充了一個“總計”,這裡使用的是rollup()配合,使用cube()也是一樣的。
#### 4、grouping sets
grouping sets()傳遞多欄位就是分別對欄位進行分組了,產生的結果就是多個欄位分別分組後合起來的行。

```handlebars
select ENAME,DEPTNO,sum(sal) from emp group by grouping sets(ENAME,DEPTNO);
王五 6000
李四 6000
張三 10000
麻子 12000
30 6000
20 6000
10 22000
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523110031412.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dYQjUyMTEyMTgxMzE0,size_16,color_FFFFFF,t_70)
從結果我們可以看出,分別針對ename分組產生四行結果和對deptno分組產生三行結果。
#### 5、grouping_id
grouping_id()配合grouping()函數使用,會根據grouping()的值來決定,比如==grouping(欄位1)為0,grouping(欄位2)為1,則grouping_id(欄位1,欄位2)的結果就是1,如果grouping(欄位1)為1,grouping(欄位2)為0,則grouping_id(欄位1,欄位2)的結果就是2,如果grouping(欄位1)為1,grouping(欄位2)為1,則grouping_id(欄位1,欄位2)的結果就是3,==

```handlebars
select ename,deptno,sum(sal),
grouping(ename),
grouping(deptno),
grouping_id(ename,deptno)
from emp group by rollup(ename,deptno) ;

李四 20 6000 0 0 0
李四 6000 0 1 1
麻子 10 12000 0 0 0
麻子 12000 0 1 1
王五 30 6000 0 0 0
王五 6000 0 1 1
張三 10 10000 0 0 0
張三 10000 0 1 1
34000 1 1 3
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200523111437863.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dYQjUyMTEyMTgxMzE0,size_16,color_FFFFFF,t_70)
### 二、逐行累計求和方法(OVER函數)
#### 1、sum(欄位) over(partition by 欄位1 order by 欄位2....)
==over(partition by 欄位1 order by 欄位2....)
按欄位1指定的欄位進行分組排序,或者說按欄位欄位2的值進行分組排序==

```handlebars
select deptno,sal,
sum(sal) over (partition by deptno order by deptno) 逐行累計求和
from emp;
10 10000 22000
10 12000 22000
20 6000 6000
30 6000 6000

select deptno,sal,
sum(sal) over ( order by deptno) 逐行累計求和
from emp
10 10000 22000
10 12000 22000
20 6000 28000
30 6000 34000
```
從上面的結果我們可以看出,加了==partition by deptno==就會根據指定欄位分組逐行累加求和,否則全部逐行累加求和。


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

-Advertisement-
Play Games
更多相關文章
  • pwd命令 功能說明:顯示當前用戶所在的工作目錄 用法:pwd [OPTION]... 當我們登錄操作系統時,我們就會處在某個目錄中,windows為桌面,在Linux操作系統中,如果我們以root用戶登錄,我們會處在root用戶的家目錄,如果以普通用戶登錄,我們會處在普通用戶的家目錄。 | 選項 ...
  • HBase為每個Region維護一個狀態,並將該狀態保留在hbase:meta中。hbase:meta 本身的Region狀態保留在ZooKeeper中。可以在Master Web UI中查看Region的過渡狀態。以下是可能的Region狀態列表。 1. 狀態機中包括下麵幾種狀態: offline ...
  • 本文來源於公眾號:胖滾豬學編程。轉載請註明出處! 一個風度翩翩,穿著格子襯衣的中年男子,拿著一個滿是劃痕的mac向她走來,看著錚亮的頭,胖滾豬心想,這肯定是尼瑪頂級架構師吧!完了要掛了。 結果面試官第一個問題,就讓胖滾豬內心暗喜 面試官 :消息隊列這東西,你還熟悉吧?消息隊列在企業中的應用場景有哪些 ...
  • 上一篇 我們模擬了單機器下哨兵模式的搭建,那麼接下來我們看下哨兵模式的實現與工作。 為什麼又分成兩篇呢?因為篇幅太長(偷懶),再一個這篇主要說的是Sentinel的初始化以及信息交換,下一篇著重說下狀態檢查、Sentinel頭領選舉與故障轉移 。 啟動並初始化Sentinel 當一個Sentinel ...
  • 前言: 本文主要講述瞭如何使用Docker快速上手HBase,省去繁雜的安裝部署環境,直接上手,小白必備。適合HBase入門學習及簡單代碼測試。 1. Docker 安裝 參考地址: 支持常用的操作系統:Centos / ubuntu / Windows / macos 等。 2. 拉取鏡像 鏡像地 ...
  • 下麵的testa表沒有數據,dept表有數據。直接select,有數據就會有結果集。 plsql的exists用於判斷子查詢是否有結果集返回,“exists (子查詢)”子查詢只要結果集有數據,則exists判斷為true,否則為false,不管結果集數據是什麼,是1啊是2啊或者很多列,只要結果集不 ...
  • DDL:用來定義RDB模式、外模式和內模式,已實現對基本表、視圖以及索引文件的定義、修改和刪除 創建數據表->創建表結構->創建表數據 數據類型 創建表 create table 表名( 欄位名 數據類型 [長度] [列級完整性約束][表級完整性約束]--多個主鍵:primary key (欄位名, ...
  • 倒排索引的初衷 倒排索引,它也是索引。索引,初衷都是為了快速檢索到你要的數據。 我相信你一定知道mysql的索引,如果對某一個欄位加了索引,一般來說查詢該欄位速度是可以有顯著的提升。 每種資料庫都有自己要解決的問題(或者說擅長的領域),對應的就有自己的數據結構,而不同的使用場景和數據結構,需要用不同 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...