如何在 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