我正在尝试将一行中的多行分组,以逗号分隔。
我的桌子上有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
答案 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