我可以用逗号分隔多列成一列吗?

我试图在我的SQL Server数据库中合并这样的东西:

  [TicketID],[Person]
  T0001 Alice
  T0001 Bob
  T0002凯瑟琳
  T0002道格
  T0003伊莱恩 

进入这个:

  [TicketID],[人物]
  T0001 Alice,Bob
  T0002凯瑟琳,道格
  T0003伊莱恩 

我需要在SQL Server和Oracle中都这样做。

我已经findMySQL的函数GROUP_CONCAT ,这正是我在这里所需要的,但MySQL不是这里的一个选项。

编辑:testing台:

 DECLARE @Tickets TABLE ( [TicketID] char(5) NOT NULL, [Person] nvarchar(15) NOT NULL ) INSERT INTO @Tickets VALUES ('T0001', 'Alice'), ('T0001', 'Bob'), ('T0002', 'Catherine'), ('T0002', 'Doug'), ('T0003', 'Elaine') SELECT * FROM @Tickets 

这是一个在SQL Server 2005+中工作的解决scheme:

 SELECT t.TicketID, STUFF(ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma], ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty] FROM @Tickets t GROUP BY t.TicketID 

参考:

  • STUFF(Transact-SQL)

而且,MySQL版本为了完整性:

 select TicketId, GROUP_CONCAT(Person ORDER BY Person SEPARATOR ', ') People from table group by TicketId 

我已经find了在Oracle中这样做的方法,但是我仍然需要在SQL Server中执行此操作。

http://technology.amis.nl/blog/6118/oracle-rdbms-11gr2-listagg-new-aggregation-operator-for-creating-comma-delimited-strings (谢谢) (ORACLE 11及以上)

 select TicketId, listagg(Person, ', ') People from table group by TicketId 

来自: http : //halisway.blogspot.com/2006/08/oracle-groupconcat-updated-again.html

 with data as ( select TicketId, Person, ROW_NUMBER() over (partition by TicketId order by Person) "rownum", COUNT(*) over (partition by TicketId) "count" from Table ) select TicketId, LTRIM(sys_connect_by_path(Person,','),',') People from data where "rownum" = "count" start with "rownum" = 1 connect by prior TicketId = TicketId and prior "rownum" = "rownum" - 1 order by TicketId 
 DECLARE @Tickets TABLE ( [TicketID] char(5) NOT NULL, [Person] nvarchar(15) NOT NULL ) INSERT INTO @Tickets VALUES ('T0001', 'Alice'), ('T0001', 'Bob'), ('T0002', 'Catherine'), ('T0002', 'Doug'), ('T0003', 'Elaine') SELECT * FROM @Tickets Select [TicketID], STUFF((SELECT ',' + Person FROM @Tickets WHERE ( TicketID=Result.TicketID) FOR XML PATH ('')),1,1,'') AS BATCHNOLIST From @Tickets AS Result GROUP BY TicketID 

一个例子

 SELECT DISTINCT t.TicketID, STUFF((SELECT ', ', i.Person as [text()] FROM @Tickets i WHERE i.TicketID = t.TicketID FOR XML PATH ('')), 1, 2, '') as People FROM @Tickets t 

………或尝试…………..

 SELECT DISTINCT t.TicketID, STUFF((SELECT ', ' + i.Person /* notice this line is different */ FROM @Tickets i WHERE i.TicketID = t.TicketID FOR XML PATH ('')), 1, 2, '') as People FROM @Tickets t 

/ *这个工程,当我用这个我的表和功劳去我的经理那摇滚! * /