Reputation: 23
I have a SQL table with some survey results with columns for the ID, Question, and Result.
Since the survey has, say, 5 questions, when I query this normally, I get 5 rows for each ID as shown.
How can I get all related data on a single row for each audit ID?
(This is of course dummy data)
ID Question Result
----------------------------
100 Are you male? Yes
100 Hair Color Brown
100 Eye Color Brown
101 Are you male? Yes
101 Hair Color Blonde
101 Eye Color Hazel
102 Are you male? No
102 Hair Color Black
102 Eye Color Green
103 Are you male? No
103 Hair Color Black
103 Eye Color Blue
104 Are you male? Yes
104 Hair Color Blonde
104 Eye Color Brown
105 Are you male? Yes
105 Hair Color Brown
105 Eye Color Brown
I'd like the end result formatted like so:
ID Are you male? Hair Color Eye Color
-----------------------------------------
100 Yes Brown Brown
101 Yes Blonde Hazel
102 No Black Green
103 No Black Blue
104 Yes Blonde Brown
105 Yes Brown Brown
Upvotes: 2
Views: 369
Reputation: 1269483
You can use conditional aggregation:
select id,
max(case when question = 'Are you male?' then result end) as are_you_male,
max(case when question = 'Hair Color' then result end) as hair_color,
max(case when question = 'Eye Color' then result end) as eye_color
from t
group by id;
Upvotes: 2