SQL Puzzle | Concatenation of columns with comma and add blank if missing data

In this puzzle you have to concat the columns with comma and add blank if missing data. For more details please check the sample input and expected output.

Sample Input

Vals Data
a 1
a 5
c 9
c 7
b 6
b 4
b 6
d 1

Expected Output

Vals FinalCombination
a 1,5,””
b 6,4,6
c 9,7,””
d 1,””,””

Script

Use below script to create table and insert sample data into it.

--

CREATE TABLE AddBlankToCountDiffer
(
	 Vals VARCHAR(100)
	,[Data] VARCHAR(100)
)
GO

INSERT INTO AddBlankToCountDiffer VALUES
('a',1),
('a',5),
('c',9),
('c',7),
('b',6),
('b',4),
('b',6),
('d',1)
GO

SELECT * FROM AddBlankToCountDiffer
GO

--

Rules/Restrictions

The solution should be should use “SELECT” statement or “CTE”.

Add your solution(s) in the comments section or send you solution(s) to pawankkmr@gmail.com

Solution – 1

--

;WITH CTE1 AS
(
    SELECT  Vals ,  MAX(COUNT(*)) OVER() - COUNT(*) c  FROM AddBlankToCountDiffer
    GROUP BY Vals
)
,CTE2 AS
(
    SELECT Vals , [Data]  
    FROM AddBlankToCountDiffer 
    UNION ALL
    SELECT c.Vals , '""' [Data] FROM CTE1 c
    INNER JOIN master..spt_values m  ON c.c > m.number 
    WHERE m.type = 'p' AND c.c > 0
)
SELECT c.Vals , 
        STUFF((
        SELECT ',' + [Data]
        FROM CTE2 c1      
        WHERE c1.Vals = c.Vals       
        ORDER BY c1.Vals
        FOR XML PATH('')
        ),1,1,'') FinalCombination
FROM CTE2 c 
GROUP BY c.Vals

--

Output-1

--                            

Vals                 FinalCombination
-------------------- ------------
a                    1,5,""
b                    6,4,6
c                    9,7,""
d                    1,"",""

(4 rows affected)

                                    
--

Excellent Solution by Vaibhav

--                            

SELECT
    T1.Vals
    , CONCAT( STUFF((
        SELECT ',' + [Data]
        FROM AddBlankToCountDiffer T       
        WHERE T.Vals = T1.Vals       
        ORDER BY T.Vals
        FOR XML PATH('')
    ),1,1,'')       , REPLICATE(',""',MAX(COUNT(*)) OVER () - COUNT(*)) ) FinalCombination
FROM AddBlankToCountDiffer T1    
GROUP BY T1.Vals
                                    
--

Add a comment if you have any other solution in mind. I would love to learn it. We all need to learn.

Enjoy !!! Keep Learning

Pawan Khowal 

Http://MsbiSkills.com