背景需求
由于数据表的行数据,会随着系统不断增加,为了减少开发成本,特实现动态行转列脚本实现。
代码实现
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = 'Det_SpecialFee' --表名称
SET @groupColumn = 'ThisCN'+','+'StationCode'+','+'CustomerType' --分组
SET @row2column = 'UnoinName'
SET @row2columnValue = 'TotalM'
--从行数据中获取可能存在的列
SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])
FROM ['+@tableName+'] GROUP BY ['+@row2column+']'
--PRINT @sql_str
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N'
Drop Table Det_SpecialFee_Bak ;
SELECT * Into Det_SpecialFee_Bak FROM (
SELECT '+@groupColumn+',['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT
(SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt
ORDER BY '+@groupColumn+'';
--PRINT (@sql_str)
EXEC (@sql_str)
实现内容
参考文章:SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)