2013-10-04 15 views
0

我有一個數據庫表,其中有幾個辦公地點的用戶。這些位置由一個數字標識,在我的表格中,我有幾個用戶出現在他們工作的每個辦公地點的幾行中。我想要的是一個SQL查詢,它將合併記錄並顯示由昏迷分隔的一個字段中的所有辦公室位置。SQL - 將多行用相似的用戶名組合

這是我原來的表:

Id UserName OfficeNumber 
--- --------- ------------- 
1  user01  200 
2  user02  220 
3  user01  290 
4  user03  089 
5  user02  019 

我希望我的決賽桌看起來像下面運行查詢後:

Id UserName OfficeNumber 
--- --------- ------------- 
1  user01  200, 290 
2  user02  220, 019 
3  user03  089 

任何幫助將得到高度讚賞。

+0

你試過了什麼?你想刪除第4和5行? –

+0

你如何決定結果中的ID值? – upog

+0

是的,第4行和第5行將被刪除,摘錄將與用戶名出現在表中的第一行中的辦公室號碼合併的辦公室號碼。 – BenCee

回答

2

您可以使用SQL的服務器的XML擴展來連接行列:

SELECT ID, 
     UserName, 
     OfficeNumber = STUFF(( SELECT ',' + CAST(OfficeNumber AS VARCHAR(3)) 
           FROM YourTable b 
           WHERE a.UserName = b.UserName 
           FOR XML PATH(''), TYPE 
          ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM ( SELECT ID = MIN(ID), UserName 
      FROM YourTable 
      GROUP BY UserName 
     ) a; 

Example on SQL Fiddle

another question on SO哪裏有人問這種方法是如何工作的複雜性,並有幾個答案,所以我不會在這裏重複說明。


編輯

就好像你是不是取最小ID爲每個用戶名,但重新分配一個新的號碼作爲ID,如果ID是基於該最原始ID對每個被reassinged用戶名,那麼你可以使用:

SELECT ID, 
     UserName, 
     OfficeNumber = STUFF(( SELECT ',' + CAST(OfficeNumber AS VARCHAR(3)) 
           FROM YourTable b 
           WHERE a.UserName = b.UserName 
           FOR XML PATH(''), TYPE 
          ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM ( SELECT ID = ROW_NUMBER() OVER(ORDER BY MIN(ID)), UserName 
      FROM YourTable 
      GROUP BY UserName 
     ) a; 

Example on SQL-Fiddle

或者如果它是按字母順序排列,你可以使用

SELECT ID = ROW_NUMBER() OVER(ORDER BY a.UserName), 
     UserName, 
     OfficeNumber = STUFF(( SELECT ',' + CAST(OfficeNumber AS VARCHAR(3)) 
           FROM YourTable b 
           WHERE a.UserName = b.UserName 
           FOR XML PATH(''), TYPE 
          ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM YourTable a 
GROUP BY a.UserName 

Example on SQL-Fiddle

+0

太好了,您的解決方案對我來說非常合適。非常感謝。 – BenCee

1

查詢:

SQLFIDDLEExample

SELECT ROW_NUMBER()OVER(ORDER BY c1.UserName) AS Id, 
     c1.UserName, 
    STUFF((SELECT ', ' +x.OfficeNumber 
     FROM Table1 x 
     WHERE c1.UserName = x.UserName 
     FOR XML PATH ('') 
    ),1,1,'') as OfficeNumber 
FROM Table1 c1 
GROUP BY c1.UserName 

結果:

| ID | USERNAME | OFFICENUMBER | 
|----|----------|--------------| 
| 1 | user01 |  200, 290 | 
| 2 | user02 |  220, 019 | 
| 3 | user03 |   089 | 
+0

我認爲這不是一個問題,因爲officenumber似乎是一個標準的數字格式。但只使用'FOR XML PATH('')'而不使用額外的語法(',TYPE).value('。',NVARCHAR(MAX))'')會導致XML字符轉義。例如'<119>'的辦公室號碼將成爲'' – GarethD