I have a table like the following:
x
user_id time_id val0 val1 val2 actual_value score
1 1 1 0 0 0 0.6
1 1 0 1 0 1 0.4
1 1 0 0 1 2 0.3
1 2 1 0 0 0 0.7
1 2 0 1 0 1 0.4
1 2 0 0 1 2 0.3
2 1 1 0 0 0 0.9
2 1 0 1 0 1 0.5
2 1 0 0 1 2 0.4
I want to convert the data to wide format like the following:
user_id time_id score_0 score_1 score_2
1 1 0.6. 0.3. 0.3
1 2 0.7. 0.4. 0.3
2 1 0.9. 0.5. 0.4
the SQL I used does not have a pivot choice so I am wondering how to convert the long format to wide without using PIVOT.
Advertisement
Answer
If I understand your question correctly, you can do conditional aggregation:
select
user_id,
time_id,
max(case when val0 = 1 then score end) score0,
max(case when val1 = 1 then score end) score1,
max(case when val2 = 1 then score end) score2
from mytable
group by user_id, time_id
Maybe you want to use actual_value
to pivot instead of the val[n]
columns:
select
user_id,
time_id,
max(case when actual_value = 0 then score end) score0,
max(case when actual_value = 1 then score end) score1,
max(case when actual_value = 2 then score end) score2
from mytable
group by user_id, time_id