MS SQL Server表转置实现:空值替换为def列值的SQL查询需求
在SQL Server中实现带空值替换的表转置(行转列)
问题分析
你的需求是将原表的列(aa、bb)转为行(segment),同时将原表的行(min val、max val)转为列,且空值需替换为对应行的def值。你之前的PIVOT写法存在错误:PIVOT仅支持针对单个聚合列的转换,无法同时处理aa和bb两列,且未做空值替换处理。
解决方案
可以通过**先逆透视(列转行)处理空值,再透视(行转列)**的两步操作实现需求:
SELECT segment, [min val], [max val] FROM ( -- 第一步:将aa、bb列转为行,同时替换空值为对应行的def值 SELECT col1, 'aa' AS segment, ISNULL(aa, def) AS value FROM OriginalTable UNION ALL SELECT col1, 'bb' AS segment, ISNULL(bb, def) AS value FROM OriginalTable ) AS Unpivoted -- 第二步:将col1的取值转为列 PIVOT ( MAX(value) FOR col1 IN ([min val], [max val]) ) AS Pivoted;
执行逻辑说明
- 逆透视阶段:用
UNION ALL将原表的aa、bb列拆分为两行数据,每行对应一个segment(aa/bb),同时通过ISNULL函数把空值替换为当前行的def值。 - 透视阶段:以segment为分组依据,将col1的
min val和max val转换为列,使用MAX(value)聚合(由于每个segment+col1组合仅对应一个值,MAX操作不会改变结果)。
输出结果验证
执行上述语句后,将得到你期望的输出:
|segment |min val |max val| ------------------------- |aa |100 |500 | |bb |100 |1000 |
内容的提问来源于stack exchange,提问作者mal90
相关产品推荐
相关产品推荐

