我做了一些研究,到目前为止,这个对我来说很有意义:
Convert row value in to column in SQL server (PIVOT)
但是,我想知道是否有任何方法可以做到这一点,而不必一一声明所需的列,因为我有超过 200 列要检索。
以下是我的表格内容一览:
ID | Col_Name | Col_Value
------------------------------
1 | Item_Num | 12345
2 | Item_Date | 34567
3 | Item_Name | 97454
4 | Item_App1 | 234567
5 | Item_App2 | 345678
请注意,我有 200 多个不同的 Col_Name 值,并且我希望它是列字段。
我现在正在使用这个,但只用于 5 列:
SELECT * FROM
(
SELECT [ID], [Col_Name], [Col_Value]
FROM myTable
) AS a
PIVOT
(
MAX([Col_Value])
FOR [Col_Name] in ([Item_Num], [Item_Date], [Item_Name], [Item_App1], [Item_App2])
) AS p
ORDER BY [ID]
考虑到性能,有什么办法可以做到这一点吗?提前致谢。
最佳答案
您可以使用动态sql来创建col_name列表:
declare @pivot_col varchar(max);
declare @sql varchar(max);
select @pivot_col = string_agg( cast(col_name as varchar(max)), ', ') within group ( order by col_name ) from ( select distinct col_name from tmp_table ) A;
set @sql = 'SELECT *
FROM (
SELECT [ID], [Col_Name], [Col_Value]
FROM tmp_table
) AS a
PIVOT
(
MAX([Col_Value])
FOR [Col_Name] in (' + @pivot_col + ' )
) AS p
ORDER BY [ID]';
exec ( @sql );
PIVOT/UNPIVOT 运算符基于实体属性值模型 (EAV) 的原理构建。 EAV 模型背后的想法是您可以扩展数据库实体而无需执行数据库架构更改。因此,EAV 模型将实体的所有属性作为键/值对存储在一个表中。
如果这是您设计背后的想法,那么请使用我上面发布的动态 SQL 查询,否则按照 Gordon 的建议,使用每个 id 包含 200 多个列的常规记录。
您可以了解 PIVOT/UNPIVOT 运算符的性能 here .
编辑: 对于sql server 2016版本:
declare @pivot_col varchar(max);
declare @sql varchar(max);
select @pivot_col = STUFF( (SELECT ',' + CAST(col_name AS VARCHAR(max)) AS [text()] FROM ( select distinct col_name from tmp_table ) A ORDER BY col_name FOR XML PATH('')), 1, 1, NULL);
set @sql = 'SELECT *
FROM ( SELECT [ID], [Col_Name], [Col_Value]
FROM tmp_table
) AS a
PIVOT
(
MAX([Col_Value])
FOR [Col_Name] in (' + @pivot_col + ' )
) AS p
ORDER BY [ID]';
exec ( @sql );
关于sql - 使用 PIVOT 将 SQL Server 中的 200 多行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58912797/