Группировать данные нескольких строк через запятую

Я пытаюсь сгруппировать несколько строк в одном поле, разделенных запятыми.

У меня есть CS ID, CS Name и CS Order в моей таблице. Моя CS может заказать несколько элементов и просто хочу, чтобы все, что Order # отображались в одном поле, разделенном столбцами.

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 ответа

Вам нужно построить строку номера заказа в подзапросе, чтобы показать все заказы для этого идентификатора.

Также на данный момент это не исключает клиентов без заказов, чтобы сделать это, вы можете обернуть весь этот запрос и добавить, где Order Is Not Null

Путь For xml - это значения конкатенации строк

Примечание. Это не проверено.

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


Это решение почти то же самое, что и JustinM: s с той разницей, что он удаляет последнюю запятую.

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

licensed under cc by-sa 3.0 with attribution.