如何在 Oracle 中为指定维度的所有组合生成组小计?

oraclesoftware & codingprogramming

问题描述:
您需要计算 Oracle 中指定维度的所有组合的小计。

解决方案:
CUBE 函数将为指定维度的所有组合生成小计。如果 CUBE 中列出的列数为"n",则将有 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  ;

输出

player
title_type
total_titles
Roger Federer
ATP Tour Titles
103
Roger Federer
Grandslams
20
Roger Federer
 
123
 
ATP Tour Titles
103
 
Grandslams
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 

player
title_type
total_titles
Andre Agassi
ATP Tour Titles
52
Andre Agassi
Grandslams
8
Andre Agassi
 
60
Andy Murray
ATP Tour Titles
46
Andy Murray
Grandslams
3
Andy Murray
 
49
Andy Roddick
ATP Tour Titles
32
Andy Roddick
Grandslams
0
Andy Roddick
 
32
Novak Djokovic
ATP Tour Titles
81
Novak Djokovic
Grandslams
17
Novak Djokovic
 
98
Pete Sampras
ATP Tour Titles
64
Pete Sampras
Grandslams
14
Pete Sampras
 
78
Rafael Nadal
ATP Tour Titles
86
Rafael Nadal
Grandslams
20
Rafael Nadal
 
106
Roger Federer
ATP Tour Titles
103
Roger Federer
Grandslams
20
Roger Federer
 
123
Thomas Muster
ATP Tour Titles
39
Thomas Muster
Grandslams
1
Thomas Muster
 
40
 
ATP Tour Titles
503
 
Grandslams
83
 
 
586

相关文章