You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

执行逻辑说明

  1. 逆透视阶段:用UNION ALL将原表的aa、bb列拆分为两行数据,每行对应一个segment(aa/bb),同时通过ISNULL函数把空值替换为当前行的def值。
  2. 透视阶段:以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:52:46