2017-04-06 83 views
1

我有一个表,看起来像这样“正确”的方式使用SQL

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 Query中完成所有操作。

在此先感谢

回答

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),()); 
+0

非常感谢Gordon。非常有帮助! – Yusha

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甲骨文精通,这可能需要一些调整

+1

这是做旧的方式。问题是表被多次读取。因此,“分组集合”功能的原因已添加到DB2(以及大多数其他DBMS) – Charles