繁体   English   中英

如何在 SQL 服务器中动态将行转换为列?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM