Saturday 15 June 2019

sql server - Concatenate a single column into a comma delimited list





I've seen multiple examples of people rolling up a single column into a comma delimited list, but I need a bit more.



Here is an example of the data and results I need.



DECLARE @SalesPerson table (SalesPersonID int, SalesPersonName varchar(10))

DECLARE @Region table (RegionID int, RegionName varchar(15))
DECLARE @SalesPersonRegion table (SalesPersonID int, RegionID int)

INSERT INTO @SalesPerson (SalesPersonID, SalesPersonName) VALUES (1,'Jeff')
INSERT INTO @SalesPerson (SalesPersonID, SalesPersonName) VALUES (2,'Pat')
INSERT INTO @SalesPerson (SalesPersonID, SalesPersonName) VALUES (3,'Joe')

INSERT INTO @Region (RegionID, RegionName) VALUES (1,'North')
INSERT INTO @Region (RegionID, RegionName) VALUES (2,'South')
INSERT INTO @Region (RegionID, RegionName) VALUES (3,'East')

INSERT INTO @Region (RegionID, RegionName) VALUES (4,'West')

INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (1,1)
INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (1,2)
INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (1,3)
INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (2,2)
INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (2,3)
INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (2,4)
INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (3,1)
INSERT INTO @SalesPersonRegion (SalesPersonID,RegionID) VALUES (3,4)



A simple select will get me each sales person, with each of that salesperson's region.



SELECT 
sp.SalesPersonID,
sp.SalesPersonName,
r.RegionName
FROM @SalesPersonRegion spr
JOIN @SalesPerson sp

ON spr.SalesPersonID = sp.SalesPersonID
JOIN @Region r
ON spr.RegionID = r.RegionID


In this case, it will return 9 Rows.



I would like to get results like this:



SalesPersonID    SalesPersonName      Regions

1 Jeff North,South,East
2 Pat South,East,West
3 Joe North,West

Answer



SELECT 
sp.SalesPersonID,
sp.SalesPersonName,
Regions = STUFF
(

(
SELECT ',' + r.RegionName
FROM @Region AS r
INNER JOIN @SalesPersonRegion AS spr
ON r.RegionID = spr.RegionID
WHERE spr.SalesPersonID = sp.SalesPersonID
ORDER BY r.RegionID
FOR XML PATH(''), TYPE
).value('.[1]','nvarchar(max)'),
1,1,''

)
FROM @SalesPerson AS sp
ORDER BY sp.SalesPersonID;

No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...