2013-04-29 3 views
3

SQL Server에서 SQL을 배우고 있습니다. 여러 행을 하나의 열로 연결해야합니다. 나는 예제를 찾았지만, 내 필요에 맞게 사용할 수있는 것을 찾지 못했습니다.여러 행을 하나의 행으로 연결

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 

나는 어떤 도움을 주시면 감사하겠습니다

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 

','이름으로 행을 연결하고 싶은 Inits으로 나열했습니다. 정말 고마워.

+0

쉼표 뒤에 공백을 넣을 때와 만들지 않을 때를 만들 수 없습니다. 구별이 뭐야? – RichardTheKiwi

답변

3

SQL Server에서이 작업을 수행하려면 문자열을 연결하여 aggregatino 함수로 연결해야합니다. 아쉽게도 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 연결을 수행하기에 충분히 똑똑하지 않은 Novices는 '메시지 512, 수준 16, 상태 1, 줄 1 : 하위 쿼리가 하나 이상의 값을 반환했습니다.'라는 이유를 이해하는 데 어려움을 겪습니다. ' ',''(2-char prefix)에 대해서는 STUFF를 사용하여 2 개의 문자를 제거해야한다. – RichardTheKiwi

+0

@ 리차드 키위. . . 천 감사합니다. 나는 질의에서 두 실수 ('stuff()'에'for xml path'와'2'를 남기지 않음)를 컴퓨터에서 멀리 보았습니다. –

+0

고맙습니다. – Mona

6

불행히도 SQL Server에는 쉼표로 구분 된 목록을 생성하는 쉬운 기능이 없으므로 목록을 얻으려면 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 APPLYFOR XML PATH가 사용할 수 있습니다 :

이 작업을 수행 할 수있는 몇 가지 방법이 있습니다, 당신은 STUFFFOR 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

감사합니다. 너 너무 많이 – Mona

+0

@Mona 도와 줘서 고맙다! – Taryn

관련 문제