如何在 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 |
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP