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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...