5

Query:

CREATE TABLE #Temp1 (ID int)
CREATE TABLE #Temp2 (ID int, Value varchar(10))

INSERT INTO #Temp1 (ID)
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3

INSERT INTO #Temp2(ID, Value)
SELECT 1,'One-One'
UNION ALL
SELECT 1,'One-Two'
UNION ALL
SELECT 1,'One-One'
UNION ALL
SELECT 2,'Two-One'
UNION ALL
SELECT 2,'Two-Two'
UNION ALL
SELECT 2,'Two-One'

SELECT T1.ID, T2.Value FROM #Temp1 T1 INNER JOIN #Temp2 T2 ON T1.ID = T2.ID

DROP TABLE #Temp1
DROP TABLE #Temp2

Current Output:

ID  Value
1   One-One
1   One-Two
1   One-One
2   Two-One
2   Two-Two
2   Two-One

Desired Output:

ID  Values
1,  One-One, One-Two, One-One
2,  Two-One, Two-Two, Two-One

I would like to join two tables, #Table1 and #Tabl2, on a key column, ID, and get Value field from the 2nd table... but in a single row (as shown in desired output).

How (if possible) can I achieve the Desired Output?

Thank you

Blorgbeard
  • 101,031
  • 48
  • 228
  • 272
007
  • 2,136
  • 4
  • 26
  • 46
  • 1
    We get so many duplicates along these lines: [Concat groups in SQL Server](http://stackoverflow.com/questions/941103/concat-groups-in-sql-server) – Clockwork-Muse May 06 '14 at 00:08
  • thx for the reference. Next time, I will search with different keywords/strings. Cheers! – 007 May 06 '14 at 19:43

2 Answers2

9
SELECT T1.ID,
      STUFF((SELECT ', ' + T2.Value
             FROM   #Temp2 T2 
             WHERE  T1.ID = T2.ID
             FOR XML PATH(''),TYPE)
             .value('.','NVARCHAR(MAX)'),1,2,'') AS Value
FROM #Temp1 T1 
GROUP BY T1.ID

For SQL Server 2017 and Later Versions

SELECT T1.ID, STRING_AGG(T2.Value , ', ') AS [Value]
FROM #Temp1 T1 
INNER JOIN #Temp2 T2 ON T1.ID = T2.ID
GROUP BY T1.ID

Result Set

╔════╦═══════════════════════════╗
║ ID ║           Value           ║
╠════╬═══════════════════════════╣
║  1 ║ One-One, One-Two, One-One ║
║  2 ║ Two-One, Two-Two, Two-One ║
╚════╩═══════════════════════════╝
M.Ali
  • 67,945
  • 13
  • 101
  • 127
2

Try this:

SELECT Id, STUFF(A.Value, 1, 2, '') [Values] FROM #Temp1 T1
CROSS APPLY 
(
   SELECT ', ' + Value FROM #Temp2 T2 WHERE T1.ID = T2.ID FOR XML PATH('')
) A(Value)
WHERE A.Value IS NOT NULL
Hamlet Hakobyan
  • 32,965
  • 6
  • 52
  • 68
  • Thank you Hamlet for showing an alternative way. Will keep this handy if the other approach doesn't work for some reason. Cheers! – 007 May 06 '14 at 19:46