First you need to unpivot the data
SELECT *
FROM yourtable
CROSS apply (VALUES(col1,'Col1'),
(Cast(col2 AS VARCHAR(50)),'Col2'),
(col3,'Col3')) tc(val, columnnames)
then concatenate based on the column names to get the result
;WITH cte
AS (SELECT *
FROM yourtable
CROSS apply (VALUES(col1,'Col1'),
(Cast(col2 AS VARCHAR(50)),'Col2'),
(col3, 'Col3')) tc(val, columnnames))
SELECT DISTINCT columnnames,
'{'+Stuff(distinctvalues, 1, 1, '')+'}'
FROM cte a
CROSS apply(SELECT DISTINCT ',' + val
FROM cte b
WHERE a.columnnames = b.columnnames
FOR xml path('')) cs (distinctvalues)
Another approach
SELECT 'Col1',
Stuff((SELECT DISTINCT ',' + col1
FROM yourtable
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
UNION ALL
SELECT 'Col2',
Stuff((SELECT DISTINCT ',' + Cast(col2 AS VARCHAR(50))
FROM yourtable
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
UNION ALL
SELECT 'Col3',
Stuff((SELECT DISTINCT ',' + col3
FROM yourtable
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '')