从1开始:
ID HistID Item
5 361 Joe Smith
5 376 Prince Brown
34 250 Sue Blue
306 106 Jane Doe
306 238 Sandy Pink
392 390 Dawn Red
512 363 Gus Green
512 515 Joy Orange
512 49 Sam Strong
什么是合适的Linq或T-Sql查询给出2:
ID Item
5 Joe Smith,[br/]Prince Brown
34 Sue Blue
306 Jane Doe,[br/]Sandy Pink
392 Dawn Red
512 Gus Green,[br/]Joy Orange,[br/]Sam Strong
其中ID
,HistID
和Item
是表列名称或对象属性
如果答案是Linq变体,那么结果集必须仍然是IQueryable
,以便它可以用于进一步的查询,允许进行惰性评估。
在这两种情况下,可接受的答案可能会使每个项目都以,[br/]
结尾
PS:我认为Linq经常使用的.Aggregate()
方法不允许进一步的懒惰评估,我是对的吗?
答案 0 :(得分:1)
试试这个:
--Concatenation with FOR XML & eliminating control/encoded char expansion "& < >"
set nocount on;
declare @YourTable table (ID int, HistID int, Item varchar(25))
insert into @YourTable VALUES (5 ,361,'Joe Smith')
insert into @YourTable VALUES (5 ,376,'Prince Brown')
insert into @YourTable VALUES (34 ,250,'Sue Blue')
insert into @YourTable VALUES (306,106,'Jane Doe')
insert into @YourTable VALUES (306,238,'Sandy Pink')
insert into @YourTable VALUES (392,390,'Dawn Red')
insert into @YourTable VALUES (512,363,'Gus Green')
insert into @YourTable VALUES (512,515,'Joy Orange')
insert into @YourTable VALUES (512,49 ,'Sam Strong')
set nocount off
SELECT
t1.ID
,STUFF(
(SELECT
', <br/>' + t2.Item
FROM @YourTable t2
WHERE t1.ID=t2.ID
ORDER BY t2.Item
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
,1,7, ''
) AS ChildValues
FROM @YourTable t1
GROUP BY t1.ID
输出:
ID ChildValues
----------- ---------------------------------------------
5 Joe Smith, <br/>Prince Brown
34 Sue Blue
306 Jane Doe, <br/>Sandy Pink
392 Dawn Red
512 Gus Green, <br/>Joy Orange, <br/>Sam Strong
(5 row(s) affected)
我不确定为什么OP在其输出中有[br/]
,我使用了<br/>
,如果需要,可以轻松更改。
答案 1 :(得分:0)
好吧,在oracle中你可以执行以下操作... SQL Server具有类似的功能,具体取决于版本,oracle在11g中有一个str_agg函数。
那么..什么引擎?
Select ID, WM_CONCAT(Item)
From table
上一个堆栈答案: - &gt; Concat field value to string in SQL Server
我会在这里玩一下,让它适用于你的例子。
这应该很接近我虽然没有测试过;
SELECT
ID, STUFF(
(SELECT ',' + Item
FROM [TableName]
FOR XML PATH('')), 1, 1, '') AS 'Item'
FROM [TableName]