"权利"使用SQL计算小计的方法

时间:2017-04-06 14:09:37

标签: sql db2 db2-400

我有一张看起来像这样的表

Person#  |  Person Name   | Gender | Persons Net Worth
-----------------------------------------------------------
1          Donald J           M        20
2          George W           M        20
3          Mark   B           T        20
4          Hil    C           F        20
5          Hil    C           F        20
6          Bill   C           M        20
7          Eric   Z           M        20
8          Caitl  J           T        20

我想收集每个性别组的小计。我基本上需要

合并sum(NETWORTH) where gender = 'M' group by gender sort by gender

sum(NETWORTH) where gender = 'F' group by gender sort by gender

sum(NETWORTH) where gender = 'T' group by gender sort by gender

所以我基本上希望结果如下:

Person#  |  Person Name   | Gender | Persons Net Worth
-----------------------------------------------------------
1          Donald J           M        20
2          George W           M        20
6          Bill   C           M        20
7          Eric   Z           M        20
                                Total: 80
4          Hil    C           F        20
5          Hil    C           F        20
                                Total: 40
3          Mark   B           T        20
8          Caitl  J           T        20
                                Total: 40

我尝试使用WITH ROLLUP但最终失败了。我知道如何在后面的代码中操作来实现这一点,但是如果可能的话,我宁愿在一个SQL查询中完成所有操作。

提前致谢

2 个答案:

答案 0 :(得分:4)

我会使用grouping sets(请参阅here):

select Person#, Name, Gender, sum(networth) as networth
from t
group by grouping sets ( (#Person, Name, Gender), (Gender));

虽然这似乎做了额外的聚合,但语法对于各种小计都是灵活的。例如,如果你想要总体总数:

group by grouping sets ( (#Person, Name, Gender), (Gender), ());

答案 1 :(得分:0)

这应该可以解决这个问题:您使用union all表格及其gender聚合,在聚合的值中使用gender值,类似于原始gender },允许您根据需要对最终表进行排序。

select  *
from    (
            select  *
            from    yourTable
            union all
            select  null, null, CONCAT(Gender, '_TOT'), sum(Persons_net_worth)
            from    yourTable
            group by CONCAT(Gender, '_TOT')
        )
order by Gender

我不熟悉DB2 Oracle,这可能需要一些调整