Hi we can achieve this using Pivot and IIF condition
Normal Query
DECLARE @Table1 TABLE
(Colorid int, color varchar(6))
;
INSERT INTO @Table1
(Colorid, color)
VALUES
(1, 'Red'),
(1, 'Blue'),
(1, 'Yellow'),
(2, 'Grey'),
(2, 'Red')
;
Select Colorid,IIF([Red] IS NOT NULL,'YES','NO')[Red],IIF([Blue] IS NOT NULL,'YES','NO')[Blue],IIF([Yellow] IS NOT NULL,'YES','NO')[Yellow],IIF([Grey] IS NOT NULL,'YES','NO')[Grey] from (
select Colorid, color,ROW_NUMBER()OVER(PARTITION BY color ORDER BY color)RN from @Table1
GROUP BY Colorid, color)T
PIVOT (MAX(RN) FOR color IN ([Blue],[Red],[Yellow],[Grey]))P
Dynamic Query
if object_id('tempdb..#t') is not null
drop table #t
CREATE TABLE #t
(Colorid int, color varchar(6))
;
INSERT INTO #t
(Colorid, color)
VALUES
(1, 'Red'),
(1, 'Blue'),
(1, 'Yellow'),
(2, 'Grey'),
(2, 'Red')
;
DECLARE @statement NVARCHAR(max)
,@columns NVARCHAR(max)
SELECT @columns = ISNULL(@columns + ', ', '') + N'[' + tbl.color + ']'
FROM (
SELECT DISTINCT color
FROM #t
) AS tbl
SELECT @statement = ' Select Colorid,IIF([Red] IS NOT NULL,''YES'',''NO'')[Red],
IIF([Blue] IS NOT NULL,''YES'',''NO'')[Blue],
IIF([Yellow] IS NOT NULL,''YES'',''NO'')[Yellow],
IIF([Grey] IS NOT NULL,''YES'',''NO'')[Grey] from (
select Colorid, color,ROW_NUMBER()OVER(PARTITION BY color ORDER BY color)RN from #t
GROUP BY Colorid, color)T
PIVOT (MAX(RN) FOR color IN (' + @columns + ')) as pvt'
EXEC sp_executesql @statement = @statement