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-31
的idx_val
作为score2
。
这样,你就能得到每个 instn_no
的正确汇总结果,并解决输出行数的问题。