Как объединить результаты в T-SQL в столбец? - PullRequest
3 голосов
/ 02 сентября 2011

Я работаю над запросом, который должен дать мне результат, например:

|--Name--|--Surname--|--Language--|--Date--   | 
| James  |  Hetfield | en,gb,fr   | 2011-01-01|
| Lars   |  Ulrich   | gb,fr,ca   | 2011-01-01|

, но мой выбор получает набор строк, таких как:

| James   |  Hetfield    | en   | 2011-01-01|
| James   |  Hetfield    | gb   | 2011-01-01|
| James   |  Hetfield    | fr   | 2011-01-01|
| Lars    |  Ulrich      | gb   | 2011-01-01|
| Lars    |  Ulrich      | fr   | 2011-01-01|
| Lars    |  Ulrich      | ca   | 2011-01-01|

Какой лучший метод вы рекомендуетепреобразовать наборы результатов в значения, разделенные комой, в сгруппированном столбце «на лету»?Я обнаружил, что CROSS APPLY может выполнить эту работу, но люди говорят, что этот метод очень трудоемкий.В качестве дополнения БД имеет огромное количество данных.

Заранее спасибо, С уважением, Адриан

Ответы [ 2 ]

8 голосов
/ 02 сентября 2011

здесь лучший метод конкатенации, он не расширяет специальные символы, как другие методы XML:

--Concatenation with FOR XML & eliminating control/encoded char expansion "& < >"
set nocount on;
declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5))
insert into @YourTable VALUES (1,1,'CCC')
insert into @YourTable VALUES (2,2,'B<&>B')
insert into @YourTable VALUES (3,2,'AAA')
insert into @YourTable VALUES (4,3,'<br>')
insert into @YourTable VALUES (5,3,'A & Z')
set nocount off
SELECT
    t1.HeaderValue
        ,STUFF(
                   (SELECT
                        ', ' + t2.ChildValue
                        FROM @YourTable t2
                        WHERE t1.HeaderValue=t2.HeaderValue
                        ORDER BY t2.ChildValue
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS ChildValues
    FROM @YourTable t1
    GROUP BY t1.HeaderValue

ВЫХОД:

HeaderValue ChildValues
----------- ---------------
1           CCC
2           AAA, B<&>B
3           <br>, A & Z

(3 row(s) affected)
2 голосов
/ 02 сентября 2011

Если ваша версия SQL поддерживает FOR XML, используйте

select n.[name],CONVERT(VARCHAR(MAX),(SELECT *
        FROM (
                SELECT  l.[lang] + ' , '  AS '*'
                FROM    tblLang l
                WHERE l.[name]=n.[name]
                ) x
        FOR XML PATH (''), TYPE
    )) AS [Language]

from tblName n 

Это предполагает простую таблицу, такую ​​как

tblName
-------
name VARCHAR

tblLang
-------
lang VARCHAR
name VARCHAR

, а также добавляет конечный ,: (

...