Как объединить строки в какой-то таблице на SQL сервере? - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу присоединиться к какой-то таблице, а затем к столбцам конкатенации

MyTable

-------------------------------
ID   RowId   LangId   Caption
-------------------------------
1    1       1        ڕۆشتن
2    1       2        Go
3    1       3        اذهب
4    2       1        ئاو
5    2       2        water   
6    2       3        ماء

Я хочу объединить таблицы Заголовок столбец, например: для RowId 1 'ڕۆشتن - Go - اذهب'

Желаемый вывод

--------------------
RowId   Caption
--------------------
1       ڕۆشتن - Go - اذهب
2       ئاو- water - ماء

Я видел ссылка но не могу мне помочь

Ответы [ 4 ]

2 голосов
/ 12 апреля 2020

Вы можете использовать string_agg():

select rowid,
       string_agg(caption, ' ') within group (order by langid) as caption
from t
group by rowid;
1 голос
/ 12 апреля 2020

Вы можете использовать for xml для более старой версии:

select r.rowid,
       stuff( (select ' - '+t.caption 
               from table t 
               where t.rowid = r.rowid 
               order by t.LangId
               for xml path('') 
              ), 1, 1, ''
            ) as Caption
from (select distinct rowid from table ) r;

Вы можете использовать string_agg () для более новой версии SQL Server 17+:

select t.rowid,
       string_agg(t.caption, ' ') within group (order by t.langid) as caption
from table t
group by t.rowid;
0 голосов
/ 12 апреля 2020

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

ВЫБЕРИТЕ DISTINCT RowID, STUFF ((ВЫБЕРИТЕ DISTINCT Sub.caption + '-' ОТ @tab Sub WHERE Sub.rowid = Main.rowid FOR XML PATH ('')) , 1, 1, '') КАК ПОДТВЕРЖДЕНИЕ ОТ @tab Main

Я думаю, что этот запрос идеально подходит для вашего случая.

0 голосов
/ 12 апреля 2020

Вы можете попробовать следующий запрос, используя for xml, как показано ниже.

SELECT DISTINCT t.RowId,
  STUFF((SELECT distinct ' - ' + t1.[Caption]
         FROM 
         (
           SELECT t.[RowId],
           t2.Caption
           FROM [TestTable] AS t
           INNER JOIN [TestTable] AS t2 ON t2.[RowId] = t.[RowId]
         )
         t1
         WHERE t.RowId = t1.RowId
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'') CaptionList
FROM 
(
           SELECT t.[RowId],
           por.Caption
           FROM [TestTable] AS t
           INNER JOIN [TestTable] AS por ON por.RowId = t.RowId
)t;

Вот живое db <> fiddle demo.

enter image description here

...