如何按不同WHERE条件使用SUM计算后相减,无需创建两个查询关联?
解决方案
有更简便的实现方式,直接使用条件聚合即可完成需求,无需创建两个独立查询再做关联,修改后的SQL语句如下:
SELECT dbo_Partneriai_SK.Pavad, SUM( CASE WHEN dbo_OperacijuTipai_SK.OperacijuTipaiId = 50 THEN dbo_OperacijosPard_SK.SumaBePVM WHEN dbo_OperacijuTipai_SK.OperacijuTipaiId = 61 THEN -1 * dbo_OperacijosPard_SK.SumaBePVM ELSE 0 END ) AS NetSumOfSumaBePVM FROM (dbo_OperacijosPard_SK INNER JOIN dbo_Partneriai_SK ON dbo_OperacijosPard_SK.PartneriaiId = dbo_Partneriai_SK.PartneriaiId) INNER JOIN dbo_OperacijuTipai_SK ON dbo_OperacijosPard_SK.OperacijuTipaiId=dbo_OperacijuTipai_SK.OperacijuTipaiId WHERE (((dbo_OperacijosPard_SK.Data)>#1/1/2021#) AND ((dbo_OperacijuTipai_SK.OperacijuTipaiId)=50 Or (dbo_OperacijuTipai_SK.OperacijuTipaiId)=61)) GROUP BY dbo_Partneriai_SK.Pavad ORDER BY NetSumOfSumaBePVM DESC;
逻辑说明
- 聚合计算时对操作类型ID为50的记录,累加
SumaBePVM字段值 - 对操作类型ID为61的记录,扣减
SumaBePVM字段值 - 其余不符合条件的记录不参与计算(你已在WHERE条件中过滤仅保留ID为50和61的记录,
ELSE 0可省略,保留兼容性更强)
如果使用的是不支持CASE WHEN语法的旧版Access环境,可以替换为IIF嵌套实现同等逻辑:
SUM( IIF(dbo_OperacijuTipai_SK.OperacijuTipaiId=50, dbo_OperacijosPard_SK.SumaBePVM, IIF(dbo_OperacijuTipai_SK.OperacijuTipaiId=61, -dbo_OperacijosPard_SK.SumaBePVM, 0)) ) AS NetSumOfSumaBePVM
内容的提问来源于stack exchange,提问作者Aduomas
相关产品推荐
相关产品推荐

