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

SQL Server中如何实现Dynamic multiple pivot(动态多透视)?

在SQL Server中实现动态多透视(表格转置)

可以实现,通过**逆透视(Unpivot)+ 动态透视(Pivot)**的组合就能完成你需要的表格转置需求。以下是具体实现方案:

1. 静态透视(已知日期列的情况)

如果你的日期值是固定的(比如只有Jan'23和Feb'23),可以直接编写静态SQL:

SELECT 
    data,
    [Jan'23],
    [Feb'23]
FROM 
(
    -- 将原表的列转换为行结构
    SELECT 
        Date,
        data = 'Column_A',
        value = CAST(Column_A AS VARCHAR(20))
    FROM YourTable
    UNION ALL
    SELECT 
        Date,
        'Column_B',
        CAST(Column_B AS VARCHAR(20))
    FROM YourTable
    UNION ALL
    SELECT 
        Date,
        'LU',
        CAST(LU AS VARCHAR(20))
    FROM YourTable
) AS UnpivotedData
PIVOT
(
    -- 用MAX作为聚合函数,因每个日期+数据项组合仅对应一个值,不影响结果
    MAX(value)
    FOR Date IN ([Jan'23], [Feb'23])
) AS PivotedResult;

2. 动态透视(日期列不固定的情况)

如果后续会新增日期(比如Mar'23、Apr'23等),可以用动态SQL自动生成透视列:

DECLARE @PivotColumns NVARCHAR(MAX), @DynamicSQL NVARCHAR(MAX);

-- 自动获取所有唯一日期,拼接为透视列列表
SELECT @PivotColumns = STRING_AGG(QUOTENAME(Date), ', ')
FROM (SELECT DISTINCT Date FROM YourTable) AS UniqueDates;

-- 构造动态SQL语句
SET @DynamicSQL = N'
SELECT 
    data,
    ' + @PivotColumns + N'
FROM 
(
    SELECT 
        Date,
        data = ''Column_A'',
        value = CAST(Column_A AS VARCHAR(20))
    FROM YourTable
    UNION ALL
    SELECT 
        Date,
        ''Column_B'',
        CAST(Column_B AS VARCHAR(20))
    FROM YourTable
    UNION ALL
    SELECT 
        Date,
        ''LU'',
        CAST(LU AS VARCHAR(20))
    FROM YourTable
) AS UnpivotedData
PIVOT
(
    MAX(value)
    FOR Date IN (' + @PivotColumns + N')
) AS PivotedResult;';

-- 执行动态SQL
EXEC sp_executesql @DynamicSQL;

核心说明:

  • 逆透视处理:通过UNION ALL将原表的多列转换为行结构,同时统一所有值的数据类型(转为VARCHAR),避免透视时出现类型冲突。
  • 动态列生成:使用STRING_AGG(SQL Server 2017及以上版本支持)自动拼接所有唯一日期列,新增日期时无需手动修改SQL。
  • 聚合函数选择:MAX/MIN均可,因为每个Date + data组合仅对应一个值,聚合操作不会改变结果。

内容的提问来源于stack exchange,提问作者AKHMAD ISKANDAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:47:37