2017-04-06 38 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