我如何得到:
id Name Value
1 A 4
1 B 8
2 C 9
to
id Column
1 A:4, B:8
2 C:9
我如何得到:
id Name Value
1 A 4
1 B 8
2 C 9
to
id Column
1 A:4, B:8
2 C:9
当前回答
我使用了这种方法,可能更容易掌握。获取一个根元素,然后连接到具有相同ID但不是“正式”名称的选项
Declare @IdxList as Table(id int, choices varchar(max),AisName varchar(255))
Insert into @IdxLIst(id,choices,AisName)
Select IdxId,''''+Max(Title)+'''',Max(Title) From [dbo].[dta_Alias]
where IdxId is not null group by IdxId
Update @IdxLIst
set choices=choices +','''+Title+''''
From @IdxLIst JOIN [dta_Alias] ON id=IdxId And Title <> AisName
where IdxId is not null
Select * from @IdxList where choices like '%,%'
其他回答
不需要游标,WHILE循环或用户定义函数。
只需要创造性地使用FOR XML和PATH。
[注意:此解决方案仅适用于SQL 2005及更高版本。原来的问题没有指定使用的版本。
CREATE TABLE #YourTable ([ID] INT, [Name] CHAR(1), [Value] INT)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'A',4)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'B',8)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (2,'C',9)
SELECT
[ID],
STUFF((
SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX))
FROM #YourTable
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,2,'') AS NameValues
FROM #YourTable Results
GROUP BY ID
DROP TABLE #YourTable
如果是SQL Server 2017或SQL Server Vnext, SQL Azure,您可以使用STRING_AGG如下所示:
SELECT id, STRING_AGG(CONCAT(name, ':', [value]), ', ')
FROM #YourTable
GROUP BY id
八年后……Microsoft SQL Server vNext数据库引擎最终增强了Transact-SQL,以直接支持分组字符串连接。社区技术预览版本1.0添加了STRING_AGG函数,CTP 1.1为STRING_AGG函数添加了WITHIN GROUP子句。
参考:https://msdn.microsoft.com/en-us/library/mt775028.aspx
一个例子是
在Oracle中可以使用LISTAGG聚合函数。
原始记录
name type
------------
name1 type1
name2 type2
name2 type3
Sql
SELECT name, LISTAGG(type, '; ') WITHIN GROUP(ORDER BY name)
FROM table
GROUP BY name
导致
name type
------------
name1 type1
name2 type2; type3
如果你启用了clr,你可以使用GitHub中的Group_Concat库