简体   繁体   English

将行转换为SQL Server中的列

[英]Transform rows to columns in sql server

This is my table returned after my sp executed: 这是我的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 

And I want the result like this 我想要这样的结果

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

How can i build the result? 如何生成结果?

Creating a Temporary table to populate the sample data 创建一个临时表以填充示例数据

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')

Assigning the DATE value to a variable in order to dynamically handle the DATE 将DATE值分配给变量,以便动态处理DATE

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

Dynamic PIVOT Query to obtain the required result 动态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

OUTPUT : - 输出:-

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

https://rextester.com/XIWYS42509 https://rextester.com/XIWYS42509

--Sql Server 2014 Express Edition
--Batches are separated by 'go'

--DATA
CREATE TABLE #T  (ChildName nvarchar(50), DATE  nvarchar(50), CLASS int, [SERVING TIME] nvarchar(50))

INSERT INTO #T (ChildName, DATE , CLASS , [SERVING TIME])
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' )

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

--PIVOT
SELECT @cols =  CASE WHEN @cols IS NULL THEN C 
                      ELSE @cols +',' + C
                END
                FROM (SELECT DISTINCT '[' + DATE + ']' as C FROM  #T WHERE DATE IS NOT NULL)t;


SELECT @query = N'
SELECT ChildName,'+@cols+N' , CLASS
FROM  
(SELECT ChildName, DATE , CLASS , [SERVING TIME]    FROM #T) AS SourceTable  
PIVOT  
(  
MAX([SERVING TIME])
FOR DATE IN ('+@cols+N')  
) AS PivotTable
ORDER BY ChildName
;'

--debug
PRINT @query
EXEC Sp_EXECUTESQL @query




DROP TABLE #T
GO

You can use Pivots in SQL Server to rotate a table. 您可以在SQL Server中使用数据透视表旋转表。 They can turn rows into columns. 他们可以将行变成列。 PIVOTs are simple to work with. PIVOT很容易使用。

Refer this . 请参考

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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