Агрегировать элементы столбца, если идентификаторы имеют одинаковое значение - PullRequest
1 голос
/ 10 ноября 2011

Начиная с 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: Я прав, полагая, что метод .Aggregate(), часто используемый с Linq, не даст дальнейшую ленивую оценку?

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

попробуйте это:

--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)

Я не уверен, почему у ОП на выходе было [br/], я использовал <br/>, который можно легко изменить, если они захотят.

0 голосов
/ 10 ноября 2011

Ну, в oracle вы могли бы сделать следующее ... SQL-сервер имеет аналогичную функцию в зависимости от версии, а oracle имеет функцию str_agg в 11g.

Итак ... какой движок?

Select ID, WM_CONCAT(Item)
From table

Предыдущий ответ из стека: -> Значение поля Concat для строки в SQL Server

Я немного поэкспериментирую, чтобы он работал для вашего примера.

Это должно быть близко, хотя я не проверял это;

SELECT
ID, STUFF(
 (SELECT ',' + Item 
  FROM [TableName]
   FOR XML PATH('')), 1, 1, '') AS 'Item'
FROM [TableName]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...