根据其他列的条件求和数据

问题描述 投票:0回答:1

我有一个像这样的 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

表格计算如下:

  • ZZ级:将与ID A和B相关的所有值相加[20+10+40+60=130]
  • YY 级:将与 ID A 和 C 相关的所有值相加 [20+10+30+100=160]
  • XX 级:将与 ID B 和 C 相关的所有值相加 [30+40+60+100=230]
  • WW 和 VV 级别将不包括在内,因为它们是类型 2。

谢谢!

sql oracle
1个回答
0
投票

从获取每个 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 中的保留字。)

演示:https://dbfiddle.uk/bq0uJ06z

© www.soinside.com 2019 - 2024. All rights reserved.