2013-04-29 3 views
3

Я сейчас изучаю SQL на SQL Server. Мне нужно объединить несколько строк в один столбец. Я искал примеры, но не нахожу того, что я могу использовать в соответствии с моими потребностями.Объединить несколько строк в одну строку

Country  ProjectTA Complexity TID Sites Inits Name 
United States A8022 Obesity Low 4692 69 JT AD 
United States A8022 Obesity Low 4692 69 jpni CBM Budget 
United States A8022 Obesity Low 4692 69 PIHR AD 
United States A8022 Obesity Low 4692 69 jpni CBM Budget 
United States A8022 Obesity Low 4692 69 hale ePublishing Group 
United States S8033 CNS Medium 5423 69 ShyP CBM Payment 
United States S8033 CNS Medium 5423 69 dedu ePublishing Group 
United States S8033 CNS Low 5423 69 AHrp ePublishing Group 

Я хочу конкатенации строк по имени и Inits перечислены с ''

United States A8022 Obesity Low 4692 69 JT,PIHR AD 
United States A8022 Obesity Low 4692 69 jpni, PIHR CBM Budget 
United States A8022 Obesity Low 4692 69 hale   ePublishing Group 
United States S8033 CNS Medium 5423 69 ShyP   CBM Payment 
United States S8033 CNS Medium 5423 69 dedu, Ahrp ePublishing Group 

Любая помощь будет оценена. Спасибо.

+0

Я не могу разобрать, когда вы хотите пробел после запятой, а когда нет. В чем же отличие? – RichardTheKiwi

ответ

3

Для этого в SQL Server вам необходимо объединить строки вместе как функцию агрегатирования. К сожалению, SQL Server не имеет group_concat() или listagg() или некоторых связанных функций. Вот метод в SQL Server:

select Country, ProjectTA, Complexity, TID, 
     stuff((select ', '+Inits 
       from t t2 
       where t2.Name = t.Name and 
        t2.country = t.country and 
        t2.ProjectTA = t.ProjectTA and 
        t2.Tid = t.Tid 
       for xml path(''), type 
      ).value('.','nvarchar(max)'), 1, 2, '' 
      ) as InitsList, 
     Name 
from t 
group by country, ProjectTA, Complexity, TID, name; 

Похоже, вы группируя больше чем имя, поэтому я включил все поля на строки, кроме inits.

+3

Пожалуйста, ** попробуйте ** ** всегда ** проверить свою работу и использовать форму 'FOR XML..TYPE' как общее правило. Новички, недостаточно умные для выполнения конкатенации SQL Server, вероятно, будут пытаться понять, почему они получают «Msg 512, Level 16, State 1, Line 1: Subquery возвратил более 1 значения» с вашим кодом. Также обратите внимание, что для символа '','' (2-char prefix) вам нужно снять 2 символа с помощью STUFF. – RichardTheKiwi

+0

@ RichardTheKiwi. , , Огромное спасибо. Я был вдали от своего компьютера в течение часа, понимая, что я сделал обе эти ошибки в запросе (не учитывая 'for xml path' и' 2' на 'stuff()'. –

+0

Большое вам спасибо – Mona

6

К сожалению, у SQL Server нет простой функции для создания списка, разделенного запятыми, для получения списка вам нужно будет реализовать FOR XML PATH.

Есть несколько способов сделать это, вы можете использовать STUFF и FOR XML PATH:

select distinct t1.country, 
    t1.ProjectTA, 
    t1.Complexity, 
    t1.TID, 
    t1.Sites, 
    STUFF(
     (SELECT ', ' + t2.Inits 
      FROM yt t2 
      where t1.Country = t2.Country 
      and t1.ProjectTA = t2.ProjectTA 
      and t1.TID = t2.TID 
      and t1.Sites = t2.Sites 
      and t1.name = t2.name 
      FOR XML PATH ('')) 
      , 1, 1, '') AS inits, 
    t1.name 
from yt t1; 

См SQL Fiddle with demo

Или вы можете использовать CROSS APPLY и FOR XML PATH:

select distinct t1.country, 
    t1.ProjectTA, 
    t1.Complexity, 
    t1.TID, 
    t1.Sites, 
    left(t2.inits, len(t2.inits)-1) inits, 
    t1.name 
from yt t1 
cross apply 
(
    select t2.Inits + ', ' 
    from yt t2 
    where t1.Country = t2.Country 
    and t1.ProjectTA = t2.ProjectTA 
    and t1.TID = t2.TID 
    and t1.Sites = t2.Sites 
    and t1.name = t2.name 
    FOR XML PATH('') 
) t2 (inits); 

См SQL Fiddle with Demo , Оба результата дают результат:

|  COUNTRY | PROJECTTA | COMPLEXITY | TID | SITES |  INITS |    NAME | 
------------------------------------------------------------------------------------------- 
| United States |  A8022 | Obesity Low | 4692 | 69 |  hale | ePublishing Group | 
| United States |  A8022 | Obesity Low | 4692 | 69 | jpni, jpni |  CBM Budget | 
| United States |  A8022 | Obesity Low | 4692 | 69 | JT, PIHR |    AD | 
| United States |  S8033 |  CNS Low | 5423 | 69 | dedu, AHrp | ePublishing Group | 
| United States |  S8033 | CNS Medium | 5423 | 69 | dedu, AHrp | ePublishing Group | 
| United States |  S8033 | CNS Medium | 5423 | 69 |  ShyP |  CBM Payment | 
+0

Thank вы так много – Mona

+0

@Mona Happy to help! – Taryn

Смежные вопросы