sql - 使用 PIVOT 将 SQL Server 中的 200 多行转换为列

标签 sql sql-server pivot

我做了一些研究,到目前为止,这个对我来说很有意义:

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/

相关文章:

python - 通过逗号和枢轴解析数据框列 - python

java - Java中的随机枢轴快速排序

mysql - SQL 别名不起作用

MySQL - 有条件地添加来自不同表的值?

sql-server - 将来自不同数据库的数据整理到同一个输出窗口

c# - 通过 C# 启动 SQL Server

sql - 为什么 T-SQL 没有错误?

php - 循环遍历 php 中的表格以找到适合我的数据的最佳位置

sql-server - 如何处理 FOR XML PATH/AUTO - SQL Server 中的空白值?

c# - 在 linq 中使用数据透视表