[英]How to convert row to column dynamically in SQL Server?
我有一张桌子
name value1 value2 value3
-------------------------------
abc 100 200 200
abc1 101 201 NULL
abc2 NULL NULL 200
abc3 NULL NULL 200
abc4 NULL NULL 200
预期结果
abc abc1 abc2 abc3 abc4
-----------------------------------
100 101 NULL NULL NULL
200 201 NULL NULL NULL
200 NULL 200 200 200
请建议如何使用 pivot 或 T-SQL 中的任何其他方法动态转换它
只需制作UNPIVOT
,然后PIVOT
:
DROP TABLE dbo.DataSource
CREATE TABLE dbo.DataSource
(
[name] VARCHAR(10)
,[value1] INT
,[value2] INT
,[value3] INT
);
INSERT INTO dbo.DataSource ([name], [value1], [value2], [value3])
VALUES ('abc', 100, 200, 200)
,('abc1', 101, 201, NULL)
,('abc2', NULL, NULL, 200)
,('abc3', NULL, NULL, 200)
,('abc4', NULL, NULL, 200);
SELECT [abc], [abc1], [abc2], [abc3], [abc4]
FROM dbo.DataSource DS
UNPIVOT
(
[value] FOR [column] IN ([value1], [value2], [value3])
) UNPVT
PIVOT
(
MAX([value]) FOR [name] IN ([abc], [abc1], [abc2], [abc3], [abc4])
) PVT;
此查询的动态部分是 unpivot 和 pivot 列。 因此,如果您需要动态解决方案,只需使用以下代码:
DECLARE @DynamictSQLStatement NVARCHAR(MAX)
,@UnpivotColumns NVARCHAR(MAX)
,@PivotColumns NVARCHAR(MAX);
SET @PivotColumns = STUFF
(
(
SELECT DISTINCT ',' + QUOTENAME([name])
FROM dbo.DataSource
ORDER BY ',' + QUOTENAME([name])
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @UnpivotColumns = STUFF
(
(
SELECT DISTINCT ',' + QUOTENAME([name])
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.DataSource ')
AND [name] <> 'name'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @DynamictSQLStatement = N'SELECT ' + @PivotColumns + '
FROM dbo.DataSource DS
UNPIVOT
(
[value] FOR [column] IN (' + @UnpivotColumns + ')
) UNPVT
PIVOT
(
MAX([value]) FOR [name] IN (' + @PivotColumns + ')
) PVT;'
EXEC sp_executesql @DynamictSQLStatement;
对于UNPIVOT
列,我们使用系统视图,对于PIVOT
,我们需要接触真实数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.