我如何得到:
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
当前回答
一个例子是
在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
其他回答
只是补充一下Cade所说的,这通常是一个前端显示的事情,因此应该在那里处理。我知道有时候100%用SQL编写文件导出或其他“仅SQL”解决方案更容易,但大多数时候这种连接应该在显示层中处理。
没有看到任何交叉应用的答案,也不需要XML提取。这是凯文·费尔柴尔德的一个略有不同的版本。在更复杂的查询中使用它更快更容易:
select T.ID
,MAX(X.cl) NameValues
from #YourTable T
CROSS APPLY
(select STUFF((
SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX))
FROM #YourTable
WHERE (ID = T.ID)
FOR XML PATH(''))
,1,2,'') [cl]) X
GROUP BY T.ID
如果group by只包含一个项目,您可以通过以下方式显著提高性能:
SELECT
[ID],
CASE WHEN MAX( [Name]) = MIN( [Name]) THEN
MAX( [Name]) NameValues
ELSE
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
END
FROM #YourTable Results
GROUP BY ID
如果是SQL Server 2017或SQL Server Vnext, SQL Azure,您可以使用STRING_AGG如下所示:
SELECT id, STRING_AGG(CONCAT(name, ':', [value]), ', ')
FROM #YourTable
GROUP BY id
如果你启用了clr,你可以使用GitHub中的Group_Concat库