2013-04-29 39 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 

我想連接的名稱行,並與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 2013-04-29 21:49:54

回答

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字符前綴),你需要使用STUFF關閉2個字符。 – RichardTheKiwi 2013-04-29 22:02:08

+0

@RichardTheKiwi。 。 。萬分感謝。我離開計算機一個小時,意識到我在查詢中犯了這兩個錯誤(在stuff()中省略了'for xml path'和'2'。 – 2013-04-29 22:45:50

+0

非常感謝 – Mona 2013-05-01 20:22:35

6

不幸的是,SQL Server沒有一個簡單的函數來生成一個逗號分隔列表,你將不得不實現FOR XML PATH來獲取列表。

有幾個方法可以做到這一點,你可以使用STUFFFOR 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

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 2013-05-01 20:21:39

+0

@Mona樂意幫忙! – Taryn 2013-05-01 20:22:58