[英]Transform rows to columns in sql server
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
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.