下面是我的表格结构。
ScheduleDate FirstName ShiftName
3/1/2019 Emp2 SHIFT A
3/2/2019 Emp2 SHIFT A
3/2/2019 Emp3 SHIFT A
3/2/2019 Emp1 SHIFT A
3/1/2019 Emp3 SHIFT B
3/2/2019 Emp2 SHIFT B
3/2/2019 Emp3 SHIFT B
3/2/2019 Emp1 SHIFT B
3/1/2019 Emp1 SHIFT C
3/2/2019 Emp2 SHIFT C
3/2/2019 Emp3 SHIFT C
3/2/2019 Emp1 SHIFT C
3/1/2019 Emp4 WEEKLY OFF
3/2/2019 Emp4 WEEKLY OFF我需要的结果是
FirstName 3/1/2019 3/2/2019
Emp1 SHIFT C SHIFT A,SHIFT B ,SHIFT C
Emp2 SHIFT A SHIFT A,SHIFT B ,SHIFT C
Emp3 SHIFT B SHIFT A,SHIFT B ,SHIFT C
Emp4 WEEKLY OFF WEEKLY OFF我需要将动态行转换为列,因为每个月的日期都不同。一名员工将在一天中有多个班次。因此,我需要多个班次显示在每一天由逗号分隔,如果可用。
下面是我尝试过的,下面是我的SQL SERVER查询及其结果。
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp
Select * Into
#Temp
From
(Select * from T_Test) as f
order by FirstName, ScheduleDate
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.ScheduleDate)
FROM #Temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT FirstName, ' + @cols + ' from
(
select FirstName
, ShiftNAme
, ScheduleDate
from #Temp
) x
pivot
(
max(ShiftName)
for ScheduleDate in (' + @cols + ')
) p '
execute(@query)结果是
FirstName 3/1/2019 3/2/2019
Emp1 SHIFT C SHIFT C
Emp2 SHIFT A SHIFT C
Emp3 SHIFT B SHIFT C
Emp4 WEEKLY OFF WEEKLY OFF但是我需要多个移位来连接每天的逗号。有没有人能帮我做到这一点,感谢你的帮助。
用于创建表的方案
CREATE TABLE [dbo].[T_Test](
[ScheduleDate] [date] NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[ShiftName] [nvarchar](50) NOT NULL
) ON [PRIMARY]也插入查询
Insert into [dbo].[T_Test] (ScheduleDate,FirstName,ShiftName) values
('2019-3-1','Emp2','SHIFT A'),
('2019-3-2','Emp2','SHIFT A'),
('2019-3-2','Emp3','SHIFT A'),
('2019-3-2','Emp1','SHIFT A'),
('2019-3-1','Emp3','SHIFT B'),
('2019-3-2','Emp2','SHIFT B'),
('2019-3-2','Emp3','SHIFT B'),
('2019-3-2','Emp1','SHIFT B'),
('2019-3-1','Emp1','SHIFT C'),
('2019-3-2','Emp3','SHIFT C'),
('2019-3-2','Emp1','SHIFT C'),
('2019-3-2','Emp2','SHIFT C'),
('2019-3-1','Emp4','WEEKLY OFF'),
('2019-3-2','Emp4','WEEKLY OFF')注意:编辑1:我以自由纯文本的形式进行了编辑,并给出了表模式和查询,以便帮助me.Just创建表、插入数据和执行查询。
发布于 2019-03-06 17:10:42
不管怎样,我刚刚完成了;哇,这是一些糟糕/疯狂的SQL:
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT T.FirstName,' + NCHAR(10) +
STUFF((SELECT CONCAT(',',NCHAR(10),N' STUFF((SELECT CONCAT('','',ShiftName)' + NCHAR(10) +
N' FROM T_Test S' + NCHAR(10) +
N' WHERE S.Firstname = T.FirstName' + NCHAR(10) +
N' AND S.ScheduleDate = ' + QUOTENAME(CONVERT(varchar(8),T.ScheduleDate,112),N'''')) + NCHAR(10) +
N' FOR XML PATH(N''''),TYPE).value(''.'',''varchar(MAX)''),1,1,N'''') AS ' + QUOTENAME(ScheduleDate)
FROM dbo.T_Test T
GROUP BY T.ScheduleDate
FOR XML PATH(N''),TYPE).value('.','varchar(MAX)'),1,2,N'') + NCHAR(10) +
N'FROM T_Test T' + NCHAR(10) +
N'GROUP BY T.FirstName' + NCHAR(10) +
N'ORDER BY T.FirstName;';
PRINT @SQL
EXEC sp_executesql @SQL;https://stackoverflow.com/questions/55002151
复制相似问题