如何将存储过程返回的多行结果合并为单行(去除空值)
如何将多季度SQL查询结果合并为单行并去除空值
我来帮你搞定这个问题!你当前的查询会针对每个季度返回单独一行,每行只有对应季度的Qx_Number和Qx_Date有值,其他列都是NULL。要把这些行合并成单行并自动去掉空值,用聚合函数配合分组就能轻松实现。
修改后的SQL代码
WITH cte_Sum AS ( SELECT SUM(NumberOfCode) AS NumberOfCode, CodeName, Code, Quarters, Q1s, Q2s, Q3s, Q4s FROM cte_totals GROUP BY CodeName, Code, Quarters, Q1s, Q2s, Q3s, Q4s ) SELECT CodeName, Code, MAX(CASE WHEN Quarters = 'Q1' THEN NumberOfCode END) AS Q1_Number, MAX(CASE WHEN Quarters = 'Q1' THEN Q1s END) AS Q1_Date, MAX(CASE WHEN Quarters = 'Q2' THEN NumberOfCode END) AS Q2_Number, MAX(CASE WHEN Quarters = 'Q2' THEN Q2s END) AS Q2_Date, MAX(CASE WHEN Quarters = 'Q3' THEN NumberOfCode END) AS Q3_Number, MAX(CASE WHEN Quarters = 'Q3' THEN Q3s END) AS Q3_Date, MAX(CASE WHEN Quarters = 'Q4' THEN NumberOfCode END) AS Q4_Number, MAX(CASE WHEN Quarters = 'Q4' THEN Q4s END) AS Q4_Date FROM cte_Sum GROUP BY CodeName, Code; -- 核心:按CodeName和Code分组,聚合每个季度的字段
为什么这么做?
- 每个
CASE表达式只会在对应季度的行生成有效值,其他行都是NULL。 MAX()函数会自动忽略NULL值,只保留同一个CodeName+Code分组里每个季度字段的唯一有效值。- 如果
NumberOfCode是数值型,用SUM()也能得到相同结果(因为每个季度只有一个非NULL值),但MAX()更通用,同时适合日期和数值类型。
这样处理后,同一个CodeName和Code的所有季度数据就会合并成一行,所有空值都会被自动过滤掉,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user2593362
相关产品推荐
相关产品推荐

