sql - 按两行分组并减去一个数字字段
问题描述
假设我有这样的数据:
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 只是一种负担,我宁愿以一种更简洁的方式完成它。
任何帮助表示赞赏,谢谢。
解决方案
使用聚合:
select name, grp,
sum(case when type = 'NEW' then cost
when type = 'OLD' then - cost
end)
from t
group by name, grp
推荐阅读
- mysql - 使用 SYSTEM 时如何使用 MySQL Docker 修复日志中的时间戳,忽略夏令时?
- javascript - 使用 JS 计算相关连续概率 n 次
- http - Golang HTTP Timeout 测试,没有按预期超时
- html - 在网格中对齐图像
- python - PIL 如何打开 sRGB 图像?
- node.js - node.js- 在 Sequelize 中获取先前的数据值
- java - 如果数组中有重复的数字,该程序似乎不起作用
- reentrantlock - 可重入锁是否使函数可重入?
- vhdl - VHDL 上 4 位 UP 计数器的 FSM
- python - 如何使用 Python 制作时间表的图像/PDF