sql - 在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
我该如何构建结果?
解决方案
创建临时表以填充示例数据
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
推荐阅读
- firebase - 如何为 Firebase 函数 + VueJS 项目组织文件夹结构?
- redis - 无法连接到 MemoryStore 实例(GKE、Node.js)
- python - 两个“np.longdouble”之和产生与打印无关的数字错误
- c# - C# 仅在 foreach 循环中获取第一个 html 节点
- ethereum - 向以太坊智能合约发送数据,交易未被验证(区块未形成)
- sql - 加入两个包含分组和子查询的查询
- cygwin - ./autogen.sh:第 28 行:找不到命令 #139
- php - 单个请求的多个 Xdebug 转储
- r - 为不同变量的第一个非 NA 创建一个为 0 的变量,然后为其他值从 0 向上/向下计数*按*第三个变量分组
- javascript - 在手机上水平滚动包含图表的模态