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

SQL Server如何实现含3000个TargetID的表动态行转列操作

SQL Server动态行转列实现方案

你遇到的是典型的行转列场景,由于TargetID数量多无法硬编码,使用动态SQL生成PIVOT查询即可实现,具体代码如下:

兼容所有SQL Server版本的写法

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

-- 自动拼接所有目标列名,无需手动枚举TargetID
SELECT @cols = STUFF((SELECT ',' + QUOTENAME('Target' + TargetID) 
                    FROM TT
                    GROUP BY TargetID
                    ORDER BY TargetID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

-- 生成PIVOT查询语句
SET @query = N'SELECT RowID, ' + @cols + N' 
            FROM 
            (
                SELECT RowID, Actual, ''Target'' + TargetID AS TargetCol
                FROM TT
            ) x
            PIVOT 
            (
                MAX(Actual)
                FOR TargetCol IN (' + @cols + N')
            ) p 
            ORDER BY RowID'

-- 执行动态生成的查询
EXEC sp_executesql @query

SQL Server 2017及以上版本简化写法

如果你使用的是2017及以上版本,可以用STRING_AGG替代繁琐的XML拼接逻辑:

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

SELECT @cols = STRING_AGG(QUOTENAME('Target' + TargetID), ',') WITHIN GROUP (ORDER BY TargetID)
FROM (SELECT DISTINCT TargetID FROM TT) t

SET @query = N'SELECT RowID, ' + @cols + N' 
            FROM 
            (
                SELECT RowID, Actual, ''Target'' + TargetID AS TargetCol
                FROM TT
            ) x
            PIVOT 
            (
                MAX(Actual)
                FOR TargetCol IN (' + @cols + N')
            ) p 
            ORDER BY RowID'

EXEC sp_executesql @query

注意事项

如果业务中存在同一个RowID+同一个TargetID对应多条Actual记录的情况,需要先根据业务规则对重复数据做去重或聚合处理,再执行行转列逻辑,避免最终结果不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:36:05