case when 与sum(case when) 区别

select c.instn_no,case when data_bsn_dt='2024-03-31' then idx_val end - 
case when data_bsn_dt='2023-12-31' then idx_val end as score1 ,
case when data_bsn_dt='2024-03-31' then idx_val end as score2
from  a
输出为两行 如下
instn_no    score1 score2
230700000 |       |  
230700000 |       |28677
第一行的score1 为什么为空


SELECT 
    c.instn_no,
    sum(CASE WHEN data_bsn_dt = '2024-03-31' THEN idx_val END) - 
    sum(CASE WHEN data_bsn_dt = '2023-12-31' THEN idx_val END) AS score1,
    sum(CASE WHEN data_bsn_dt = '2024-03-31' THEN idx_val END) AS score2
FROM a
为什么就输出一行了,没有加sum时输出两行
  • CASE 表达式是逐行评估的,如果某行的 data_bsn_dt 不匹配 '2024-03-31' 或 '2023-12-31',则 CASE 表达式的结果为 NULL
  • 在减法计算中,如果任一 CASE 表达式结果为 NULL,则计算结果为 NULL

这意味着,除非在单个行中同时存在 '2024-03-31' 和 '2023-12-31' 的值,否则 score1 的计算将为 NULL。显然,这是不可能的,因为每行只包含一个日期值。

解决方案

正确的方法是将同一个 instn_no 的两个日期的数据合并到同一行中,然后进行计算。可以通过自联接来实现:

SELECT 
    a.instn_no,
    a.idx_val - b.idx_val AS score1,
    a.idx_val AS score2
FROM 
    a AS a
JOIN 
    a AS b ON a.instn_no = b.instn_no AND b.data_bsn_dt = '2023-12-31'
WHERE 
    a.data_bsn_dt = '2024-03-31'

这个查询中:

  • 使用 JOIN 将表 a 自联接,配对相同 instn_no 但日期不同的行。
  • a 表表示 '2024-03-31' 的数据,b 表表示 '2023-12-31' 的数据。
  • 计算 score1 时,减去同一 instn_no 下不同日期的 idx_val 值。
SELECT
c.instn_no,
sum(CASE WHEN data_bsn_dt = '2024-03-31' THEN idx_val END) -
sum(CASE WHEN data_bsn_dt = '2023-12-31' THEN idx_val END) AS score1,
sum(CASE WHEN data_bsn_dt = '2024-03-31' THEN idx_val END) AS score2
FROM a
为什么就输出一行了,没有加sum时输出两行

当你在 SQL 查询中使用 SUM 聚合函数时,它会将符合条件的行进行分组和汇总。如果不使用 GROUP BY 子句,整个结果集将被视为一个单独的组,从而只会输出一行。这就是为什么在加了 SUM 后只输出了一行,而不加 SUM 时输出了两行。

如果你想在使用 SUM 函数后仍然保留每个 instn_no 的分组,你需要使用 GROUP BY 子句。下面是修改后的查询:

 

sql

复制代码

SELECT 
    c.instn_no,
    SUM(CASE WHEN data_bsn_dt = '2024-03-31' THEN idx_val END) - 
    SUM(CASE WHEN data_bsn_dt = '2023-12-31' THEN idx_val END) AS score1,
    SUM(CASE WHEN data_bsn_dt = '2024-03-31' THEN idx_val END) AS score2
FROM a
GROUP BY c.instn_no

这样,每个 instn_no 将被单独分组,SUM 函数将对每个组进行计算,并返回每个 instn_no 的一行结果。

示例数据

假设你的表 a 如下:

instn_no   data_bsn_dt  idx_val
230700000  2024-03-31   28677
230700000  2023-12-31   28000
230800000  2024-03-31   15000
230800000  2023-12-31   14000

执行修改后的查询后,结果将是:

instn_no   score1  score2
230700000  677     28677
230800000  1000    15000

解释

  • GROUP BY c.instn_no 将数据按 instn_no 分组。
  • SUM(CASE WHEN data_bsn_dt = '2024-03-31' THEN idx_val END) 计算每个组中 data_bsn_dt 为 '2024-03-31' 的 idx_val 之和。
  • SUM(CASE WHEN data_bsn_dt = '2023-12-31' THEN idx_val END) 计算每个组中 data_bsn_dt 为 '2023-12-31' 的 idx_val 之和。
  • 两者相减得到 score1,并显示 2024-03-31idx_val 作为 score2

这样,你就能得到每个 instn_no 的正确汇总结果,并解决输出行数的问题。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值