ID具有相同值时聚合列项

时间:2011-11-10 18:12:34

标签: sql-server linq sql-server-2008 tsql

从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

其中IDHistIDItem是表列名称或对象属性

如果答案是Linq变体,那么结果集必须仍然是IQueryable,以便它可以用于进一步的查询,允许进行惰性评估。

在这两种情况下,可接受的答案可能会使每个项目都以,[br/]结尾

PS:我认为Linq经常使用的.Aggregate()方法不允许进一步的懒惰评估,我是对的吗?

2 个答案:

答案 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]