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