在将动态列转换为行时将列中的多个行连接起来

问题描述 投票:1回答:1

以下是我的表格结构。

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:我已经编辑为免费纯文本,并给出了表模式和查询,以便它可以帮助我。只需创建表,插入数据并执行我的查询。

sql-server
1个回答
1
投票

嗯,我刚刚完成了;哇这是一些可怕的/疯狂的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;
© www.soinside.com 2019 - 2024. All rights reserved.