SQL Server:对列进行分组和组合

SQL Server:对列进行分组和组合,sql,sql-server,Sql,Sql Server,我正在用一张像这样的桌子工作。我正在尝试以稍微不同的方式格式化数据 理想情况下,这就是我想要的输出 --Create/Populate [#Feedback]: if object_id('tempdb..[#Feedback]','U') is not null drop table [#Feedback] go create table [#Feedback] ( [feedbackid] int, [feedbackgroup] varchar(50),

我正在用一张像这样的桌子工作。我正在尝试以稍微不同的方式格式化数据

理想情况下,这就是我想要的输出

--Create/Populate [#Feedback]:
if object_id('tempdb..[#Feedback]','U') is not null 
    drop table [#Feedback]
go

create table [#Feedback]
(
     [feedbackid] int,
     [feedbackgroup] varchar(50),
     [feedbackdatetime] datetime,
     [feedbackresult] varchar(max),
     [feedbackdataelement] varchar(50)
)
go

set nocount on
insert [#Feedback] select 1, 'A001', '2018-08-24 08:00:00', 'true', 'ArrivedLate'
insert [#Feedback] select 2, 'A001', '2018-08-24 08:00:00', 'false', 'LeftEarly'
insert [#Feedback] select 3, 'A001', '2018-08-24 08:00:00', 'false', 'Unprepared'
insert [#Feedback] select 4, 'A001', '2018-08-24 08:00:00', 'Arrived 5 minutes late', 'Comments'
insert [#Feedback] select 5, 'A056', '2018-08-24 09:14:00', 'false', 'ArrivedLate'
insert [#Feedback] select 6, 'A056', '2018-08-24 09:14:00', 'false', 'LeftEarly'
insert [#Feedback] select 7, 'A056', '2018-08-24 09:14:00', 'true', 'Unprepared'
insert [#Feedback] select 8, 'A056', '2018-08-24 09:14:00', 'Did not bring laptop', 'Comments'
insert [#Feedback] select 9, 'B251', '2018-08-24 12:28:00', 'true', 'ArrivedLate'
insert [#Feedback] select 10, 'B251', '2018-08-24 12:28:00', 'true', 'Left Early'
insert [#Feedback] select 11, 'B251', '2018-08-24 12:28:00', 'true', 'Unprepared'
insert [#Feedback] select 12, 'B251', '2018-08-24 12:28:00', 'Showed up an hour late and had not showered, left at noon', 'Comments'
go
select * from [#Feedback]
我不知道该怎么做。我需要将所有反馈组ID组合在一起,然后我需要检查反馈结果是否为真,如果为真,则在一列中列出它。如果不止一个是正确的,我需要在一列中列出每一个。最后,我需要把评论放在自己的专栏里


理想情况下,我还希望新的“反馈”列具有一些格式更好的措辞(迟到而不是执行日期)。

如果您使用的是SQL Server(从2017年开始),则可以尝试

否则,试试这个。如果一个ID允许多个注释,则需要相应地更改注释列(如反馈列)。我忽略了单词格式,因为它实在是晦涩难懂

Group   DateTime            Feedback                                Comments
A001    2018-08-24 08:00:00 Arrived Late                            Arrived 5 minutes late
A056    2018-08-24 09:14:00 Unprepared                              Did not bring laptop
B251    2018-08-24 12:28:00 Arrived Late, Left Early, Unprepared    Showed up an hour late and had not showered, left at noon

如果您正在使用SQL Server(从2017年开始),那么您可以尝试使用

否则,试试这个。如果一个ID允许多个注释,则需要相应地更改注释列(如反馈列)。我忽略了单词格式,因为它实在是晦涩难懂

Group   DateTime            Feedback                                Comments
A001    2018-08-24 08:00:00 Arrived Late                            Arrived 5 minutes late
A056    2018-08-24 09:14:00 Unprepared                              Did not bring laptop
B251    2018-08-24 12:28:00 Arrived Late, Left Early, Unprepared    Showed up an hour late and had not showered, left at noon

基本上,您希望
CASE
s根据
[feedbackdataelement]
[feedbackresult]
中的
[feedbackresult]
的值返回一个非空或空字符串,
按[feedbackgroup]
分组

SELECT DISTINCT 
  f1.[feedbackgroup] as Group, 
  max([feedbackdatetime]) as Datetime,
  Stuff((SELECT ', ' + f2.[feedbackdataelement] 
       FROM [#feedback] AS f2 
       WHERE (f2.[feedbackresult] = 'true' AND f2.[feedbackgroup] = f1.[feedbackgroup]) 
       FOR xml path(''), type).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') 
  AS Feedback, 
  (SELECT [feedbackresult] FROM [#feedback] AS f3 
   WHERE  f3.[feedbackdataelement] = 'Comments' AND f3.feedbackgroup = f1.feedbackgroup) 
   AS Comments 
FROM   [#feedback] AS f1 
GROUP  BY f1.[feedbackgroup] 

基本上,您希望
CASE
s根据
[feedbackdataelement]
[feedbackresult]
中的
[feedbackresult]
的值返回一个非空或空字符串,
按[feedbackgroup]
分组

SELECT DISTINCT 
  f1.[feedbackgroup] as Group, 
  max([feedbackdatetime]) as Datetime,
  Stuff((SELECT ', ' + f2.[feedbackdataelement] 
       FROM [#feedback] AS f2 
       WHERE (f2.[feedbackresult] = 'true' AND f2.[feedbackgroup] = f1.[feedbackgroup]) 
       FOR xml path(''), type).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') 
  AS Feedback, 
  (SELECT [feedbackresult] FROM [#feedback] AS f3 
   WHERE  f3.[feedbackdataelement] = 'Comments' AND f3.feedbackgroup = f1.feedbackgroup) 
   AS Comments 
FROM   [#feedback] AS f1 
GROUP  BY f1.[feedbackgroup]