I have this dataset that I want to group by user_id and sum the values by category
| id | user_id | category | value | 
|---|---|---|---|
| 0 | 1 | 1 | 10 | 
| 1 | 1 | 1 | 20 | 
| 2 | 1 | 2 | 10 | 
| 3 | 1 | 2 | 30 | 
| 4 | 1 | 3 | 10 | 
| 5 | 2 | 3 | 40 | 
And I want a select returning a table with one element for user_id with one field for each category value (These are known and can only be 1, 2 or 3)
| user_id | category_1 | category_2 | category_3 | 
|---|---|---|---|
| 1 | 30 | 40 | 10 | 
| 2 | 0 | 0 | 40 | 
The only solution I’ve found is:
select r.user_id as user_id, rt_c1.value as category_1_value, rt_c2.emissions_change_co2e as scope2_co2e_emissions, rt_c3.emissions_change_co2e as scope3_co2e_emissions from tablename as r join (select rt.user_id rt.category as category, sum(rt.value) as value from tablename as rt group by rt.user_id, rt.category) as rt_c1 on rt_c1.user_id = r.user_id and rt_c1.category = 1 join (select rt.user_id rt.category as category, sum(rt.value) as value from tablename as rt group by rt.user_id, rt.category) as rt_c2 on rt_c2.user_id = r.user_id and rt_c2.category = 2 join (select rt.user_id rt.category as category, sum(rt.value) as value from tablename as rt group by rt.user_id, rt.category) as rt_c3 on rt_c3.user_id = r.user_id and rt_c3.category = 3
Advertisement
Answer
Perhaps a simple conditional aggregation
Example
Select user_id
      ,sum( case when category=1 then value else 0 end) as category_1
      ,sum( case when category=2 then value else 0 end) as category_2 
      ,sum( case when category=3 then value else 0 end) as category_3
 From  YourTable
 Group By user_id