SQL 2005 Объединить / объединить несколько строк в один столбец - PullRequest
3 голосов
/ 13 мая 2010

У нас есть немного SQL-запроса. Скажем, у меня есть результаты, которые выглядят так ...

61E77D90-D53D-4E2E-A09E-9D6F012EB59C |
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | B
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | C
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | D
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | E
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | F

есть ли способ, которым я могу сгруппировать эти результаты в SQL, чтобы вернуть как

61E77D90-D53D-4E2E-A09E-9D6F012EB59C | A B C D
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | E F

Есть идеи, люди?

Большое спасибо

Дейв

Ответы [ 3 ]

5 голосов
/ 13 мая 2010

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

set nocount on;
declare @t table (id char(36), x char(1))
insert into @t (id, x)
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'A' union
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'B' union
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'C' union
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'D' union
select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'E' union
select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'F'
set nocount off

SELECT p1.id, 
          stuff(
                   (SELECT
                        ' ' + x
                        FROM @t p2
                        WHERE p2.id=p1.id
                        ORDER BY id, x
                        FOR XML PATH('') 
                   )
                   ,1,1, ''
               ) AS YourValues
      FROM @t p1
      GROUP BY id

ВЫХОД:

id                                   YourValues
------------------------------------ --------------
61E77D90-D53D-4E2E-A09E-9D6F012EB59C A B C D
7ce953ca-a55b-4c55-a52c-9d6f012ea903 E F

(2 row(s) affected)

EDIT
на основании комментария OP о необходимости запуска существующего запроса попробуйте следующее:

;WITH YourBugQuery AS
(
    --replace this with your own query
    select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' AS ColID , 'A' AS ColX 
    union select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'B' 
    union select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'C' 
    union select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'D' 
    union select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'E' 
    union select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'F'

)
SELECT p1.ColID, 
          stuff(
                   (SELECT
                        ' ' + ColX
                        FROM YourBugQuery p2
                        WHERE p2.ColID=p1.ColID
                        ORDER BY ColID, ColX
                        FOR XML PATH('') 
                   )
                   ,1,1, ''
               ) AS YourValues
      FROM YourBugQuery p1
      GROUP BY ColID

набор результатов такой же, как показано выше.

1 голос
/ 13 мая 2010

Я предпочитаю определять пользовательский агрегат. Вот пример UDA, которое выполнит что-то очень близкое к тому, что вы просите.

Зачем использовать пользовательский агрегат вместо вложенного SELECT? Все дело в производительности и в том, с чем вы готовы мириться. Для небольшого количества элементов вы наверняка можете избежать вложенного SELECT, но для большого «n» вы заметите, что план запроса по сути запускает вложенный SELECT один раз для каждой строки в списке вывода. Это может быть поцелуй смерти, если вы говорите о большом количестве строк. С помощью UDA возможно объединить эти значения за один проход.

Компромисс, конечно, заключается в том, что UDA требует от вас использовать CLR для его развертывания, и это часто делают не многие люди. В Oracle эта конкретная ситуация несколько приятнее, поскольку вы можете использовать PL / SQL напрямую для создания пользовательского агрегата, но я отступаю ...

0 голосов
/ 13 мая 2010

Другой способ сделать это - использовать опцию FOR XML PATH

SELECT
    [ID],
    (
        SELECT
            [Value] + ' '
        FROM
            [YourTable] [YourTable2]
        WHERE
            [YourTable2].[ID] = [YourTable].[ID]
        ORDER BY
            [Value]
        FOR XML PATH('')
    ) [Values]
FROM
    [YourTable]
GROUP BY
    [YourTable].[ID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...