使用 SQL 计算小计的 "right" 方法
The "right" way to calculate subtotals using SQL
我有一个 table 看起来像这样
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 查询中完成所有操作。
提前致谢
这应该可以解决问题:您将 union all
与 table 一起使用,并通过 gender
聚合,在聚合中使用类似于 gender
的值原始的 gender
,它允许您根据需要对最终的 table 进行排序。
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,这可能需要一些调整
我会使用 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), ());
我有一个 table 看起来像这样
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 查询中完成所有操作。
提前致谢
这应该可以解决问题:您将 union all
与 table 一起使用,并通过 gender
聚合,在聚合中使用类似于 gender
的值原始的 gender
,它允许您根据需要对最终的 table 进行排序。
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,这可能需要一些调整
我会使用 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), ());