在SQL Server中枢轴和取消枢轴

时间:2019-01-18 04:46:07

标签: sql sql-server tsql pivot

我的表格如下所示:

enter image description here

有50个此类参数和2000多个VISIT_ID。

我必须以VISIT_ID为列而参数为行的方式旋转表。我需要这样做,以便可以检查每个VISIT_ID,哪些参数和多少参数的值为1。

我知道对于枢轴或不枢轴,只能通过使用求和或计数之类的聚合操作来完成。但是由于VISIT_ID和Parameter都是唯一的,因此如何旋转表。

预期输出:

enter image description here

1 个答案:

答案 0 :(得分:1)

在这里您可以找到静态示例和使用动态T-SQL语句的示例:

--DROP TABLE IF EXISTS [dbo].[DataSource]; 

CREATE TABLE [dbo].[DataSource]
(
    [VISIT_ID] INT
   ,[Parameter1] TINYINT
   ,[Parameter2] TINYINT
   ,[Parameter3] TINYINT
);

INSERT INTO [dbo].[DataSource] ([VISIT_ID], [Parameter1], [Parameter2], [Parameter3])
VALUES (100, 1, 2, 1)
      ,(101, 4, 2, 1)
      ,(102, 2, 2, 0);

-- static

SELECT *
FROM [dbo].[DataSource]
UNPIVOT
(
    [value] FOR [column] IN ([Parameter1], [Parameter2], [Parameter3])
) UNPVT
PIVOT
(
    MAX([value]) FOR [VISIT_ID] IN ([100], [101], [102])
) PVT;

--- danymic

DECLARE @DynamicTSQLStatement NVARCHAR(MAX)
       ,@DynamicColumnsP NVARCHAR(MAX)
       ,@DynamicColumnsU NVARCHAR(MAX);

SET @DynamicColumnsP = STUFF
                        (
                            (
                                SELECT ',[' + [name] + ']'
                                FROM [sys].[columns]
                                WHERE [name] LIKE 'Parameter%'
                                    AND [object_id] = OBJECT_ID('[dbo].[DataSource]')
                                ORDER BY [name]
                                FOR XML PATH('') ,TYPE
                            ).value('.', 'NVARCHAR(MAX)')
                            ,1
                            ,1
                            ,''
                        );

SET @DynamicColumnsU = STUFF
                        (
                            (
                                SELECT ',[' + CAST([VISIT_ID] AS VARCHAR(12)) + ']'
                                FROM [dbo].[DataSource]                             
                                ORDER BY [VISIT_ID]
                                FOR XML PATH('') ,TYPE
                            ).value('.', 'NVARCHAR(MAX)')
                            ,1
                            ,1
                            ,''
                        );

SET @DynamicTSQLStatement = N'
SELECT *
FROM [dbo].[DataSource]
UNPIVOT
(
    [value] FOR [column] IN (' + @DynamicColumnsP + ')
) UNPVT
PIVOT
(
    MAX([value]) FOR [VISIT_ID] IN (' + @DynamicColumnsU + ')
) PVT;';

EXEC sp_executesql @DynamicTSQLStatement;
相关问题