如何在Oracle中生成組小計和大計?


問題陳述
您希望在 Oracle 中找出總計、小計和大計。

解決方案
Oracle ROLLUP 函式透過從右到左的方法執行多級分組,透過中間級別彙總到任何大計。為了演示 ROLLUP 函式,我們將建立一個表來儲存網球運動員以及該運動員獲得的 ATP 巡迴賽冠軍和大滿貫冠軍。

我們將首先為這個需求建立必要的資料。

示例

-- Drop table DROP TABLE atp_titles; -- Create table CREATE TABLE atp_titles (   player             VARCHAR2(100) NOT NULL,   title_type         VARCHAR2(100) NOT NULL,   titles             NUMBER NOT NULL);

示例

-- insert  ATP tour titles won by the player
INSERT INTO atp_titles VALUES('Roger Federer','ATP Tour Titles',103);
INSERT INTO atp_titles VALUES('Rafael Nadal','ATP Tour Titles',86);
INSERT INTO atp_titles VALUES('Novak Djokovic','ATP Tour Titles',81);
INSERT INTO atp_titles VALUES('Pete Sampras','ATP Tour Titles',64);
INSERT INTO atp_titles VALUES('Andre Agassi','ATP Tour Titles',52);
INSERT INTO atp_titles VALUES('Andy Murray','ATP Tour Titles',46);
INSERT INTO atp_titles VALUES('Thomas Muster','ATP Tour Titles',39);
INSERT INTO atp_titles VALUES('Andy Roddick','ATP Tour Titles',32);

示例

-- insert  grandslam titles won by the player
INSERT INTO atp_titles VALUES('Roger Federer','Grandslams',20);
INSERT INTO atp_titles VALUES('Rafael Nadal','Grandslams',20);
INSERT INTO atp_titles VALUES('Novak Djokovic','Grandslams',17);
INSERT INTO atp_titles VALUES('Pete Sampras','Grandslams',14);
INSERT INTO atp_titles VALUES('Andre Agassi','Grandslams',8);
INSERT INTO atp_titles VALUES('Andy Murray','Grandslams',3);
INSERT INTO atp_titles VALUES('Thomas Muster','Grandslams',1);
INSERT INTO atp_titles VALUES('Andy Roddick','Grandslams',0);

COMMIT;

現在我們將檢視插入到 atp_titles 表中的幾條記錄。

示例

SELECT * FROM atp_titles ORDER BY 1;

輸出

Andre Agassi    ATP Tour Titles     52
Andre Agassi    Grandslams          8
Andy Murray Grandslams          3
Andy Murray ATP Tour Titles     46
Andy Roddick    ATP Tour Titles     32
Andy Roddick    Grandslams          0
............................
............................

Oracle ROLLUP 表示式從右到左生成組小計以及大計。對於以上資料,假設我們想要確定球員“羅傑·費德勒”獲得的總冠軍數(即 ATP 巡迴賽冠軍 + 大滿貫冠軍)。

示例

SELECT player,title_type, SUM(titles) AS total_titles   FROM atp_titles  WHERE player = 'Roger Federer' GROUP BY ROLLUP (player,title_type) ORDER BY player,title_type ;

輸出

球員
冠軍型別
總冠軍數
羅傑·費德勒
ATP 巡迴賽冠軍
103
羅傑·費德勒
大滿貫
20
羅傑·費德勒
 
123
 
 
123

ROLLUP 為“n”個列出的列生成 n+1 個級別的子總計。在上面的示例中,在按球員和冠軍型別進行常規分組後,ROLLUP 函式將所有冠軍型別值彙總起來,以便我們看到球員“羅傑·費德勒”的大滿貫級別的總和。您可以在輸出中看到以粗體顯示的彙總行。

現在我們將對錶中的所有球員應用 ROLLUP 函式,如下所示

SQL

示例

SELECT player, title_type, SUM(titles) As total   FROM atp_titles GROUP BY ROLLUP (player,title_type) ORDER BY player,title_type;

輸出

球員
冠軍型別
總冠軍數
安德烈·阿加西
ATP 巡迴賽冠軍
52
安德烈·阿加西
大滿貫
8
安德烈·阿加西
 
60
安迪·穆雷
ATP 巡迴賽冠軍
46
安迪·穆雷
大滿貫
3
安迪·穆雷
 
49
安迪·羅迪克
ATP 巡迴賽冠軍
32
安迪·羅迪克
大滿貫
0
安迪·羅迪克
 
32
諾瓦克·德約科維奇
ATP 巡迴賽冠軍
81
諾瓦克·德約科維奇
大滿貫
17
諾瓦克·德約科維奇
 
98
皮特·塞普里斯
ATP 巡迴賽冠軍
64
皮特·塞普里斯
大滿貫
14
皮特·塞普里斯
 
78
拉斐爾·納達爾
ATP 巡迴賽冠軍
86
拉斐爾·納達爾
大滿貫
20
拉斐爾·納達爾
 
106
羅傑·費德勒
ATP 巡迴賽冠軍
103
羅傑·費德勒
大滿貫
20
羅傑·費德勒
 
123
托馬斯·穆斯特
ATP 巡迴賽冠軍
39
托馬斯·穆斯特
大滿貫
1
托馬斯·穆斯特
 
40
 
 
586

ROLLUP 函式允許我們執行部分彙總以減少計算的子總計數量。以下部分彙總的輸出如下所示

SQL

示例

SELECT player, title_type, SUM(titles) As total   FROM atp_titles GROUP BY ROLLUP (player,title_type) ORDER BY player,title_type;

輸出

球員
冠軍型別
總冠軍數
安德烈·阿加西
ATP 巡迴賽冠軍
52
安德烈·阿加西
大滿貫
8
安德烈·阿加西
 
60
安迪·穆雷
ATP 巡迴賽冠軍
46
安迪·穆雷
大滿貫
3
安迪·穆雷
 
49
安迪·羅迪克
ATP 巡迴賽冠軍
32
安迪·羅迪克
大滿貫
0
安迪·羅迪克
 
32
諾瓦克·德約科維奇
ATP 巡迴賽冠軍
81
諾瓦克·德約科維奇
大滿貫
17
諾瓦克·德約科維奇
 
98
皮特·塞普里斯
ATP 巡迴賽冠軍
64
皮特·塞普里斯
大滿貫
14
皮特·塞普里斯
 
78
拉斐爾·納達爾
ATP 巡迴賽冠軍
86
拉斐爾·納達爾
大滿貫
20
拉斐爾·納達爾
 
106
羅傑·費德勒
ATP 巡迴賽冠軍
103
羅傑·費德勒
大滿貫
20
羅傑·費德勒
 
123
托馬斯·穆斯特
ATP 巡迴賽冠軍
39

更新於: 2020-12-04

4K+ 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.