2016-05-16 59 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