首页 > 解决方案 > 按两行分组并减去一个数字字段

问题描述

假设我有这样的数据:

   Table
   Num1      Grp        Type          Cost
   ----      ---        ----          ----
   12X       XXX        OLD             17
   12X       XXX        NEW             23

我有很多行数据要这样做,这只是一个例子

我想要实现的是将这两者都卷起来,并在 NEW - OLD 成本列中有所不同

期望的结果:

   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 只是一种负担,我宁愿以一种更简洁的方式完成它。

任何帮助表示赞赏,谢谢。

标签: sqlsql-servergroup-bycommon-table-expression

解决方案


使用聚合:

select name, grp,
       sum(case when type = 'NEW' then cost 
                when type = 'OLD' then - cost
           end)
from t
group by name, grp

推荐阅读