I have a query that looks like this
SELECT J.JobID,T.Title FROM JobsTagMap J
Left Join Tags T
ON J.TagID=T.TagID
That returns the following dataset (simplified, JobID is actually a UniqueIdentifier)
JobID Title
1 Tag1
1 Tag2
2 Tag2
2 Tag5
2 Tag9
Now, i'd like to group this by the JobID-column and concatenate the Title, so the results is as following
JobID Title
1 Tag1,Tag2
2 Tag2,Tag5,Tag9
How would i do that?
If you are using sql server 2005+. Then you can do like this:
SELECT
JobsTagMap.JobID,
STUFF
(
(
SELECT
',' +Title
FROM
Tags
WHERE
Tags.TagID=JobsTagMap.TagID
FOR XML PATH('')
)
,1,1,'') AS Title
FROM JobsTagMap
EDIT
Because you did not show us the table structure and the data in the different tables. It was a lite bit hard to know. So I assume that your table structure looks something like this:
CREATE TABLE JobsTagMap
(
JobID INT,
TagID INT
)
CREATE TABLE Tags
(
TagID INT,
Title VARCHAR(100)
)
With this data:
INSERT INTO JobsTagMap
VALUES(1,1),(1,2),(2,2),(2,4),(2,5)
INSERT INTO Tags
VALUES(1,'Tag1'),(2,'Tag2'),(3,'Tag2'),(4,'Tag5'),(5,'Tag9')
If you are getting that data that you are showing the JobID
cannot be unique. You might have the a Job
table somewhere where it is unique. If you just want to use these table that you are showing then you need to do something like this:
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY JobID ORDER BY JobID) AS RowNbr,
JobsTagMap.*
FROM
JobsTagMap
)
SELECT
*,
STUFF
(
(
SELECT
',' +Title
FROM
Tags
JOIN JobsTagMap
ON Tags.TagID=JobsTagMap.TagID
WHERE
JobsTagMap.JobID=CTE.JobID
FOR XML PATH('')
)
,1,1,'') AS Title
FROM
CTE
WHERE
CTE.RowNbr=1
This will get you this result:
1 1 1 Tag1,Tag2
1 2 2 Tag2,Tag5,Tag9
So in the future always show what table structure and it data. That will give you better answers
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With