通过逗号分隔对多行数据进行分组

时间:2013-12-04 19:31:06

标签: sql sql-server sql-server-2008

我正在尝试将一行中的多行分组,以逗号分隔。

我的桌子上有CS ID,CS名称和CS顺序。我的CS可以订购多个商品,只希望所有订单#显示在一个以列分隔的字段中。

SELECT 
  dbo.Tb1.CSID, 
  dbo.Tb2.CSName, 
  **dbo.Tb3.OrderNumber** 
FROM dbo.Tb1   
  LEFT OUTER JOIN bo.Tb3 ON dbo.Tb1.id = dbo.Tb3.CSID 
  LEFT OUTER JOIN dbo.Tb2 ON dbo.Tb1.CSID = dbo.Tb2.CSID 
WHERE dbo.Tb1.Tb1.CSStatus = 'Current') 
  AND (dbo.Tb3.OrderNumber IS NOT NULL) ORDER BY dbo.Tb1.CSName

2 个答案:

答案 0 :(得分:1)

您需要在子查询中构建订单号字符串,以显示该ID的所有订单。

同样截至目前,这不会排除没有订单的客户,为此您可以包装整个查询并添加订单不为空的位置

For xml路径来自Concatenating Row Values

注意:这是未经测试的。

SELECT 
  dbo.Tb1.CSID, 
  dbo.Tb2.CSName, 
  ( SELECT OrderNumber + ', '
     FROM dbo.Tb3 sq
    WHERE sq.CSID = tb1.CSID
    FOR XML PATH('') ) AS Orders    
)
FROM dbo.Tb1 tb1  
  LEFT OUTER JOIN dbo.Tb2 ON dbo.Tb1.CSID = dbo.Tb2.CSID 
WHERE dbo.Tb1.Tb1.CSStatus = 'Current') 
  AND ( IS NOT NULL) ORDER BY dbo.Tb1.CSName

答案 1 :(得分:1)

此解决方案与JustinM几乎相同:不同之处在于它删除了最后一个逗号。

SELECT 
  dbo.Tb1.CSID, 
  dbo.Tb2.CSName, 
  STUFF(( SELECT ',' +  OrderNumber
     FROM dbo.Tb3 
    WHERE dbo.Tb1.id = dbo.Tb3.CSID 
    FOR XML PATH('') ),1,1,'') AS Orders    
)
FROM dbo.Tb1 tb1  
  LEFT OUTER JOIN dbo.Tb2 ON dbo.Tb1.CSID = dbo.Tb2.CSID 
WHERE dbo.Tb1.Tb1.CSStatus = 'Current') 
  AND ( IS NOT NULL) ORDER BY dbo.Tb1.CSName