Scenario:
I have a table with below Schema
Name | Column1 | Column2 | Column3 | Column4 |
---|---|---|---|---|
Gopi | 1 | 1 | 0 | 1 |
Krishna | 0 | 1 | 1 | 1 |
and I want the output in the following format
Name | ColumnsSelected |
---|---|
Gopi | Column1, Column2, Column4, |
Krishna | Column2, Column3, Column4, |
Solution:
I achieved the above using CROSS APPLY
If the column names are static
SELECT Name,ColumnsSelected=( SELECT cname+',' FROM TestTable B CROSS apply (VALUES('Column1',Column1), ('Column2',Column2), ('Column3',Column3), ('Column4',Column4)) ca (cname, data) WHERE data = 1 AND A.Name=B.Name FOR XML PATH('')) FROM TestTable A Group by name
If the column names are dynamic
DECLARE @collist VARCHAR(MAX)='', @sql NVARCHAR(MAX); SELECT @collist += '(''' + COLUMN_NAME + ''',' + COLUMN_NAME + '),' FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME = 'TestTable' AND COLUMN_NAME NOT IN ('id','Name') AND TABLE_SCHEMA = 'dbo'; SELECT @collist = LEFT(@collist, Len(@collist) - 1); SET @sql =' SELECT Name,ColumnsSelected=( SELECT cname+'', '' FROM TestTable B CROSS APPLY (VALUES' + @collist + ') ca (cname, data) WHERE data=1 AND A.Name=B.Name FOR XML PATH('''')) FROM TestTable A GROUP BY A.Name '; EXEC Sp_executesql @sql;
Happy Coding! 😊
Credits: Stack overflow question
0 comments:
Post a Comment