我可以用逗号分隔多列成一列吗?
我试图在我的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
/ *这个工程,当我用这个我的表和功劳去我的经理那摇滚! * /