0

This is my table returned after my sp executed:

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?

2 Answers2

1

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

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

    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
Praveen ND
  • 540
  • 2
  • 10
0

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

Tohm
  • 305
  • 1
  • 5