【发布时间】:2021-12-23 16:35:23
【问题描述】:
提前致谢。我基本上是在尝试运行 SQL 查询,以便 StaffID:Name:Floor:Date:Shifts 的结果为 1:1:1:1:Many。
这是我的初始查询和示例结果:
SELECT
ST.STAFFNUM [StaffID],
ST.FULLNAME [Name],
ST.AREA [Floor],
CONVERT(VARCHAR(10), TS.EVENTDATE, 103) [Date],
LEFT(CONVERT(VARCHAR(10), TS.SHIFTSTART, 8), 5) [ShiftStart],
LEFT(CONVERT(VARCHAR(10), TS.SHIFTEND, 8), 5) [ShiftEnd]
FROM
TIMES TS
LEFT JOIN STAFF ST ON TS.STAFFNUM = ST.STAFFNUM
WHERE
TS.EVENTDATE BETWEEN '2021/01/01' AND '2021/01/01'
ORDER BY
ST.AREA,
ST.FULLNAME,
TS.EVENTDATE,
TS.SHIFTSTART
;
StaffID | Name | Floor | Date | ShiftStart | ShiftEnd
==============================================================
1000 | Andrew | 1 | 01/01/2021 | 06:00 | 14:00
1000 | Andrew | 1 | 01/01/2021 | 14:00 | 15:00
8654 | Belinda | 2 | 01/01/2021 | 06:00 | 14:00
9876 | Craig | 3 | 01/01/2021 | 06:00 | 14:00
然后,我将 ShiftStart 和 ShiftEnd 列与以下内容相结合,以获得以下结果:
CONCAT(LEFT(CONVERT(VARCHAR(10), TS.SHIFTSTART, 8), 5),'-',LEFT(CONVERT(VARCHAR(10), TS.SHIFTEND, 8), 5)) [Shift]
StaffID | Name | Floor | Date | Shift
====================================================
1000 | Andrew | 1 | 01/01/2021 | 06:00-14:00
1000 | Andrew | 1 | 01/01/2021 | 14:00-15:00
8654 | Belinda | 2 | 01/01/2021 | 06:00-14:00
9876 | Craig | 3 | 01/01/2021 | 06:00-14:00
我想不出接下来要做的是将 Andrew 的班次(以及其他任何人在同一日期和楼层等的多个班次)结合起来,如下所示:
StaffID | Name | Floor | Date | Shifts
=================================================================
1000 | Andrew | 1 | 01/01/2021 | 06:00-14:00, 14:00-15:00
8654 | Belinda | 2 | 01/01/2021 | 06:00-14:00
9876 | Craig | 3 | 01/01/2021 | 06:00-14:00
注意:如果有人被转移到另一个楼层(偶尔),我想将该 Shift/s 保留在该楼层独有的单独行上,以便可以拆分楼层数据并通过电子邮件发送给该楼层的经理。 只要行的所有数据都相同,除了 Shift,我想组合这些行并列出 Shifts。 再次感谢!
【问题讨论】:
-
看来你需要STRING_AGG
-
我在这里解释了同样的事情:stackoverflow.com/questions/69895021/…
-
我可以将它添加到我现有的查询中吗? Anton Grig 在下面做了,但还是不行
-
我对 STRING_AGG 命令进行了一些研究 - 我的数据库版本不够新,无法使用它(SQL Server 12)
标签: sql sql-server concatenation distinct-values