我如何得到:
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
当前回答
使用XML路径不会完美地连接你可能期望…它会将“&”替换为“&”,也会混淆<”和“>” ...也许还有其他一些事情,不确定……但是你可以试试这个
我想到了一个变通办法…您需要替换:
FOR XML PATH('')
)
:
FOR XML PATH(''),TYPE
).value('(./text())[1]','VARCHAR(MAX)')
...或者NVARCHAR(MAX)如果这是你使用的。
为什么SQL没有一个串联聚合函数?这是PITA。
其他回答
我想对所有的医护人员说:
SELECT
s.NOTE_ID
,STUFF ((
SELECT
[note_text] + ' '
FROM
HNO_NOTE_TEXT s1
WHERE
(s1.NOTE_ID = s.NOTE_ID)
ORDER BY [line] ASC
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,
1,
2,
'') AS NOTE_TEXT_CONCATINATED
FROM
HNO_NOTE_TEXT s
GROUP BY NOTE_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
使用XML路径不会完美地连接你可能期望…它会将“&”替换为“&”,也会混淆<”和“>” ...也许还有其他一些事情,不确定……但是你可以试试这个
我想到了一个变通办法…您需要替换:
FOR XML PATH('')
)
:
FOR XML PATH(''),TYPE
).value('(./text())[1]','VARCHAR(MAX)')
...或者NVARCHAR(MAX)如果这是你使用的。
为什么SQL没有一个串联聚合函数?这是PITA。
我使用了这种方法,可能更容易掌握。获取一个根元素,然后连接到具有相同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 '%,%'
只是补充一下Cade所说的,这通常是一个前端显示的事情,因此应该在那里处理。我知道有时候100%用SQL编写文件导出或其他“仅SQL”解决方案更容易,但大多数时候这种连接应该在显示层中处理。