Oracle 总计列和行

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9733918/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-10 04:03:24  来源:igfitidea点击:

Oracle grand total column and row

oraclesumrow

提问by Cristian A. Hurtado Romero

I have this table as a result from another query

我有这个表是另一个查询的结果

STATUS          R1  R2  R3  R4  R5  R6  R7  R8  R9
----------------------------------------------------
ACCEPTED        322 241 278 473 575 595 567 449 605
ADECUACIONES    0   0   0   0   2   0   1   0   50
AET             0   0   2   0   0   0   0   0   11
EXECUTED        0   80  1   18  9   57  34  30  20
IN PROCESS      0   0   0   0   0   4   25  2   112
FREQ            0   55  2   76  25  117 7   73  48
INSTALL         1   4   1   10  5   14  2   13  62
WO INSTALL      9   2   51  24  143 17  15  59  16
WOT VL          0   1   0   0   1   0   0   0   0
OTHER          22   7   20  28  44  30  6   6   109
PROG            1   0   1   0   0   2   3   0   0
PTE PROG        0   5   0   0   0   0   3   19  93
TMX             0   0   0   28  4   8   11  3   14
PROJ            0   1   12  26  13  8   0   2   4

What I expect to have is this

我期望的是这个

STATUS          R1  R2  R3  R4  R5  R6  R7  R8  R9  TOTAL
----------------------------------------------------------
ACCEPTED        322 241 278 473 575 595 567 449 605 4105
ADECUACIONES    0   0   0   0   2   0   1   0   50  53
AET             0   0   2   0   0   0   0   0   11  13
EXECUTED        0   80  1   18  9   57  34  30  20  249
IN PROCESS      0   0   0   0   0   4   25  2   112 143
FREQ            0   55  2   76  25  117 7   73  48  403
INSTALL         1   4   1   10  5   14  2   13  62  112
WO INSTALL      9   2   51  24  143 17  15  59  16  336
WOT VL          0   1   0   0   1   0   0   0   0   2
OTHER          22   7   20  28  44  30  6   6   109 272
PROG            1   0   1   0   0   2   3   0   0   7
PTE PROG        0   5   0   0   0   0   3   19  93  120
TMX             0   0   0   28  4   8   11  3   14  68
PROJ            0   1   12  26  13  8   0   2   4   66
TOTAL           355 396 368 683 821 852 674 656 1144 5949

I've been playing with grouping()and rollup(), but I always get duplicated rows and unwanted null values.

我一直在玩grouping()rollup(),但我总是得到重复的行和不需要的空值。

回答by Florin Ghita

If you have problems, grouping_id function will help you.

如果你有问题, grouping_id 函数会帮助你。

(You can select grouping_id(col), but also grouping_id(col1, col2, col3, etc..))

(您可以选择 grouping_id(col),也可以选择 grouping_id(col1, col2, col3, etc..))

But your case is simpler.

但你的情况更简单。

It is like:

它像是:

drop table fg_test_group;
create table fg_test_group (a number, b number, c number, d number);

insert into fg_test_group values (1, 2, 3, 4);
insert into fg_test_group values (2, 2, 3, 4);
insert into fg_test_group values (3, 2, 3, 4);


select  nvl(to_char(a), 'total') as a , sum(b), sum(c), sum(d), grouping_id(a)
from fg_test_group
group by rollup (a) 
;

where a is Status in your case.

在您的情况下,其中 a 是 Status。

回答by VANDANA

CREATE TABLE TEST1 (STATUS  VARCHAR2(10), R1 NUMBER, R2 NUMBER, R3 NUMBER);
INSERT INTO TEST1 VALUES ('ACCEPTED', 322,241,278);
INSERT INTO TEST1 VALUES ('EXECUTED', 0, 80, 1);
INSERT INTO TEST1 VALUES ('FREQ', 0, 55, 2);
COMMIT;


select  NVL(TO_CHAR(STATUS), 'total') as STATUS ,SUM(R1) R1, SUM(R2) R2 , SUM(R3) R3, SUM(R1+R2+R3)
from TEST1
group by rollup (STATUS) 
;


STATUS          R1  R2  R3  SUM(R1+R2+R3)

ACCEPTED        322 241 278 841

EXECUTED        0   80  1   81

FREQ            0   55  2   57

total           322 376 281 979