I have a dataset like below:
x
Id A14_Comment A15_Comment A16_Comment
1 Comment1 null null
2 Comment2 Comment3 Comment4
3 null Comment5 Comment6
4 null null Comment7
What I need to do is to get the output below:
Id A14_Comment A15_Comment A16_Comment Code
1 Comment1 null null A14
2 Comment2 Comment3 Comment4 A14
2 Comment2 Comment3 Comment4 A15
2 Comment2 Comment3 Comment4 A16
3 null Comment5 Comment6 A15
3 null Comment5 Comment6 A16
4 null null Comment7 A16
As to be seen, my purpose is to add a Code
column and duplicate rows by labelling the code. The query below gives me how many times I need to add row with different code for each row, but couldn’t figure out an efficient way to do the rest.
select Id, (
select count(*)
from (values (T.A14_Comment), (T.A15_Comment), (T.A16_Comment)) as v(col)
where v.col is not null and v.col <> ''
) from #Comments as T
Any help would be appreciated.
Advertisement
Answer
I would use apply
:
select c.*, c.code
from #Comments c cross apply
(select c.code
from (values (c.A14_Comment, 'A14'), (c.A15_Comment, 'A15'), (c.A16_Comment, 'A16')
) v(col, code)
where col is not null
) c;
The subquery is actually unnecessary. You might find this simpler:
select c.*, v.code
from #Comments c cross apply
(values (c.A14_Comment, 'A14'), (c.A15_Comment, 'A15'), (c.A16_Comment, 'A16')
) v(col, code)
where v.col is not null