首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL计算小计的“正确”方法

使用SQL计算小计的“正确”方法
EN

Stack Overflow用户
提问于 2017-04-06 14:09:36
回答 2查看 3.3K关注 0票数 1

我有张像这样的桌子

代码语言:javascript
复制
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

所以我想要的结果是:

代码语言:javascript
复制
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查询中完成所有操作。

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-06 14:23:26

我将使用grouping sets (参见这里):

代码语言:javascript
复制
select Person#, Name, Gender, sum(networth) as networth
from t
group by grouping sets ( (#Person, Name, Gender), (Gender));

虽然这似乎是一种额外的聚合,但是语法对于所有类型的小计都是灵活的。例如,如果您也想要总的总数:

代码语言:javascript
复制
group by grouping sets ( (#Person, Name, Gender), (Gender), ());
票数 5
EN

Stack Overflow用户

发布于 2017-04-06 14:15:37

这应该可以做到这一点:将union all与表及其gender聚合一起使用,在聚合表中使用gender值,类似于原始的gender,这使您可以按需要对最终表进行排序。

代码语言:javascript
复制
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甲骨文,这可能需要一些调整

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43257669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档