2016-05-16 85 views
0

我如何獲得:如何使用GROUP BY連接SQL Server中的不同列?

ID Description  Details 
1 A    Details 1 
1 B    Details 2 
2 A    Details 3 
2 A    Details 4 
2 B    Details 5 
3 B    Details 6 
3 B    Details 7 
3 B    Details 8 

TO:

ID Values 
1 A: Details 1 - B: Details 2 
2 A: Details 3, Details 4 - B:Details 5 
3 B: Details 6, Details 7, Details 8 

我試圖按照這個線程解決方案: How to use GROUP BY to concatenate strings in SQL Server?

但是這給:

ID Values 
1 A: Details 1 - B: Details 2 
2 A: Details 3, A: Details 4 - B:Details 5 
3 B: Details 6, B:Details 7, B:Details 8 

有沒有辦法不重複描述結果集中的ption列?

謝謝!

+0

你可以發佈你用來得到結果的查詢嗎?很可能你需要從'STUFF'的內部連接中去除'Description'列到外部,所以你只能得到'B'或'A'一次。 –

+0

我發佈了上面提供查詢的鏈接。 :) – ohhzumm

+0

完成整個路徑:'Tbl.description +':'+ tbl.Details',這將提供所需的結果。 – sagi

回答

3

使用ROW_NUMBER僅在第一項中添加Description

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY Id, Description ORDER BY Details) 
    FROM #tbl 
) 
SELECT 
    ID, 
    [Values] = 
     STUFF((
      SELECT 
       CASE WHEN rn = 1 THEN ' - ' + Description + ': ' ELSE ', ' END + Details 
      FROM Cte 
      WHERE Id = t.Id 
      ORDER BY Description, Details 
      FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)') 
     , 1, 2, '') 
FROM #tbl t 
GROUP BY Id 

ONLINE DEMO

+1

我認爲應該有一個區別當desc A和desc B(',/ -') – sagi

+1

@sagi,謝謝你捕捉。我現在很忙。我稍後再更新。 –

+1

我認爲你的解決方案已經足夠好了,但要做到這一點,你應該使用'LEAD/LAG'來查看最後一個被連接的等級是否大於或等於這個等級,如果是,請使用'-',else' '。 – sagi

1

我已經修改了你的表名替換#tew獲得所需要的output.Kindly查詢。 我希望這對你有幫助。

;with cte as 
(SELECT distinct ID,Description + ':' + 
     STUFF(
       (SELECT  ',' + SubTableUser.Details 
       FROM  #tew AS SubTableUser 
       WHERE  SubTableUser.ID = outerTable.ID and SubTableUser.Description = outerTable.Description 
       FOR XML PATH('')), 1, 1, '') AS Details 

FROM #tew as outerTable 
) 
select distinct ID, 
     STUFF(
       (SELECT  ',' + SubTableUser.Details 
       FROM  cte AS SubTableUser 
       WHERE  SubTableUser.ID = outerTable.ID 
       FOR XML PATH('')), 1, 1, '') AS Details 

FROM cte as outerTable 
order by ID