按两行分组并减去数字字段
Group by two rows and and subtract a numeric field
假设我有这样的数据:
Table
Num1 Grp Type Cost
---- --- ---- ----
12X XXX OLD 17
12X XXX NEW 23
我有很多行数据要对其执行此操作,这只是一个示例
我想要实现的是将这两个汇总起来,并计算新旧成本列的差异
期望的结果:
Table
Num1 Grp Cost
---- --- ----
12X XXX 6
我使用的方法是使用 2 个 CTE,如下所示:
WITH OLD as (Select * from table where type ='OLD')
, NEW as (Select * from table where type ='NEW')
然后
Select Num1, Grp, n.Cost - o.cost as Cost
from OLD o INNER JOIN NEW n on o.Num1 = n.Num1 and o.grp = n.group
但是,我实际拥有的两个 CTE 是巨大的查询,有没有什么方法可以让我以更简单的方式完成它?我觉得拥有两个 CTE 只是一种超载,我宁愿以更简洁的方式完成它。
感谢任何帮助,谢谢。
使用聚合:
select name, grp,
sum(case when type = 'NEW' then cost
when type = 'OLD' then - cost
end)
from t
group by name, grp
假设我有这样的数据:
Table
Num1 Grp Type Cost
---- --- ---- ----
12X XXX OLD 17
12X XXX NEW 23
我有很多行数据要对其执行此操作,这只是一个示例
我想要实现的是将这两个汇总起来,并计算新旧成本列的差异
期望的结果:
Table
Num1 Grp Cost
---- --- ----
12X XXX 6
我使用的方法是使用 2 个 CTE,如下所示:
WITH OLD as (Select * from table where type ='OLD')
, NEW as (Select * from table where type ='NEW')
然后
Select Num1, Grp, n.Cost - o.cost as Cost
from OLD o INNER JOIN NEW n on o.Num1 = n.Num1 and o.grp = n.group
但是,我实际拥有的两个 CTE 是巨大的查询,有没有什么方法可以让我以更简单的方式完成它?我觉得拥有两个 CTE 只是一种超载,我宁愿以更简洁的方式完成它。
感谢任何帮助,谢谢。
使用聚合:
select name, grp,
sum(case when type = 'NEW' then cost
when type = 'OLD' then - cost
end)
from t
group by name, grp