首页 > 解决方案 > 在sql server中将行转换为列

问题描述

这是我的 sp 执行后返回的表:

ChildName  |      DATE        |      CLASS       | SERVING TIME

 Andrew        20.11.2019             1            Breakfast,Lunch,Snacks
 Andrew        21.11.2019             1            Breakfast,Lunch
 David           NULL                 1            NULL  
 Ijas          22.11.2019             1            Snacks            
 Kerry           NULL                 1            NULL  
 Paul            NULL                 1            NULL 
 Ram           22.11.2019             1            Snacks
 Ram           23.11.2019             1            Lunch 

我想要这样的结果

ChildName  |      20.11.2019         |      21.11.2019       |  22.11.2019   |  23.11.2019    |Class

Andrew      Breakfast,Lunch,Snacks        Breakfast,Lunch         NULL            NULL          1
David              NULL                       NULL                NULL            NULL          1   
Ijas               NULL                       NULL                Snacks          NULL          1
Kerry              NULL                       NULL                NULL            NULL          1
Paul               NULL                       NULL                NULL            NULL          1
Ram                NULL                       NULL                Snacks          Lunch         1

我该如何构建结果?

标签: sqlsql-serverpivot

解决方案


创建临时表以填充示例数据

IF OBJECT_ID('tempdb..#Table') IS NOT NULL
DROP TABLE #Table;

CREATE TABLE #Table (ChildName NVARCHAR(20), [DATE] NVARCHAR(20), CLASS NVARCHAR(20),[SERVING TIME] NVARCHAR(200))
DECLARE @Date AS NVARCHAR(MAX),
        @Query AS NVARCHAR(MAX)

INSERT INTO #Table 
VALUES
('Andrew','20.11.2019','1','Breakfast,Lunch,Snacks'),
('Andrew','21.11.2019','1','Breakfast,Lunch'),
('David',NULL,'1','NULL'),
('Ijas','22.11.2019','1','Snacks'),           
('Kerry',NULL,'1',NULL),
('Paul',NULL,'1',NULL),
('Ram','22.11.2019','1','Snacks'),
('Ram','23.11.2019','1','Lunch')

将 DATE 值分配给变量以动态处理 DATE

SELECT @Date = STUFF((SELECT DISTINCT
                        ',' + QUOTENAME([DATE]) 
                      FROM 
                        #Table
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

动态 PIVOT 查询以获得所需的结果

    SET @Query= 'SELECT 
                *
            FROM 
            (
              SELECT 
                ChildName,[SERVING TIME],[DATE]
              FROM 
                #Table
            ) SRC
            PIVOT
            (
              MAX([SERVING TIME])
              FOR [DATE] IN ('+@Date+')
            ) PIV;'

EXEC sp_executesql @Query

输出 : -

ChildName   20.11.2019              21.11.2019      22.11.2019  23.11.2019
Andrew      Breakfast,Lunch,Snacks  Breakfast,Lunch NULL        NULL
David       NULL                    NULL            NULL        NULL
Ijas        NULL                    NULL            Snacks      NULL
Kerry       NULL                    NULL            NULL        NULL
Paul        NULL                    NULL            NULL        NULL
Ram         NULL                    NULL            Snacks      Lunch

推荐阅读