如何在 Oracle 中為指定維度的所有組合生成組小計?


問題陳述
您想找出 Oracle 中指定維度所有組合的小計。

解決方案
CUBE 函式將為指定的維度所有組合生成小計。如果“n”是 CUBE 中列出的列數,則將有 2n 個小計組合。

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

示例

-- 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
............................
............................

現在我們將 CUBE 函式應用於 atp 選手 - “Roger Federer”

SQL

示例

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

輸出

選手
賽事型別
總冠軍數
Roger Federer
ATP巡迴賽冠軍
103
Roger Federer
大滿貫
20
Roger Federer
 
123
 
ATP巡迴賽冠軍
103
 
大滿貫
20
 
 
123

除了 ROLLUP 擴充套件生成的子總數之外,CUBE 擴充套件還為指定的選手和賽事型別的所有組合生成了子總數。上面以粗體突出顯示了 CUBE 的輸出。

現在我們將對錶中的所有選手應用 CUBE 函式,如下所示

示例

SELECT player,title_type, SUM(titles) AS total_titles   FROM atp_titles GROUP BY CUBE (player,title_type) ORDER BY player,title_type 

選手
賽事型別
總冠軍數
Andre Agassi
ATP巡迴賽冠軍
52
Andre Agassi
大滿貫
8
Andre Agassi
 
60
Andy Murray
ATP巡迴賽冠軍
46
Andy Murray
大滿貫
3
Andy Murray
 
49
Andy Roddick
ATP巡迴賽冠軍
32
Andy Roddick
大滿貫
0
Andy Roddick
 
32
Novak Djokovic
ATP巡迴賽冠軍
81
Novak Djokovic
大滿貫
17
Novak Djokovic
 
98
Pete Sampras
ATP巡迴賽冠軍
64
Pete Sampras
大滿貫
14
Pete Sampras
 
78
Rafael Nadal
ATP巡迴賽冠軍
86
Rafael Nadal
大滿貫
20
Rafael Nadal
 
106
Roger Federer
ATP巡迴賽冠軍
103
Roger Federer
大滿貫
20
Roger Federer
 
123
Thomas Muster
ATP巡迴賽冠軍
39
Thomas Muster
大滿貫
1
Thomas Muster
 
40
 
ATP巡迴賽冠軍
503
 
大滿貫
83
 
 
586

更新於: 2020-12-04

189 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告