我有一个像这样的 SQL 表:
身份证 | 等级 | 类型 | 价值 |
---|---|---|---|
A | ZZ | 1 | 20 |
A | YY | 1 | 10 |
C | XX | 1 | 30 |
B | ZZ | 1 | 40 |
B | XX | 1 | 60 |
C | YY | 1 | 100 |
D | WW | 2 | 70 |
D | VV | 2 | 90 |
对于每个“级别”,如果其“类型”= 1,我想对与包含该级别的 ID 关联的所有“值”求和,即使“值”不与该特定级别直接关联。例如,对于级别 ZZ,它将对与 ID A 和 B 关联的所有值求和,因为这两个 ID 包括级别 ZZ:ID A Level ZZ + ID A Level YY + ID B Level ZZ + ID B Level XX。 (更多详细信息如下)。
我的预期结果将是这样的表格:
级别 | 价值 |
---|---|
ZZ | 130 |
YY | 160 |
XX | 230 |
表格计算如下:
谢谢!
从获取每个 ID 的总和开始,从此一切变得简单。
with
id_sums as
(
select id, sum(value) as sum_value
from mytable
group by id
)
select t.levl, sum(s.sum_value) as total
from mytable t
join id_sums s on s.id = t.id
where t.type = 1
group by t.levl
order by t.levl;
同样可以使用窗口函数来完成,您可能会或可能不会发现它更具可读性:
with
with_sums as
(
select t.*, sum(value) over (partition by id) as id_sum_value
from mytable t
where type = 1
)
select levl, sum(id_sum_value) as total
from with_sums
group by levl
order by levl;
(我在这里将你的级别列重命名为 levl,因为
LEVEL
是 Oracle 中的保留字。)