如何在 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 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.