I have two tables which I can generate with SELECT statements (joining multiple tables) as follows:
Table 1:
ID | Site | type | time |
---|---|---|---|
1 | Dallas | 2 | 01-01-2021 |
2 | Denver | 1 | 02-01-2021 |
3 | Chicago | 1 | 03-01-2021 |
4 | Chicago | 2 | 29-11-2020 |
5 | Denver | 1 | 28-02-2020 |
6 | Toronto | 2 | 11-05-2019 |
Table 2:
ID | Site | collected | deposited |
---|---|---|---|
1 | Denver | NULL | 29-01-2021 |
2 | Denver | 01-04-2021 | 29-01-2021 |
3 | Chicago | NULL | 19-01-2020 |
4 | Dallas | NULL | 29-01-2019 |
5 | Winnipeg | 13-02-2021 | 17-01-2021 |
6 | Toronto | 14-02-2020 | 29-01-2020 |
I would like the result to be grouped by Site, having on each column the COUNT of type=1 , type=2, deposited and collected, all of the 4 columns between a selected time interval. Example: (interval between 01-06-2020 and 01-06-2021:
Site | type1 | type2 | deposited | collected |
---|---|---|---|---|
Dallas | 0 | 1 | 0 | 0 |
Denver | 1 | 0 | 2 | 1 |
Chicago | 1 | 1 | 0 | 0 |
Toronto | 0 | 0 | 0 | 0 |
Winnipeg | 0 | 0 | 1 | 1 |
Advertisement
Answer
How about union all
and aggregation?
select site, sum(case when type = 1 then 1 else 0 end) as type_1, sum(case when type = 2 then 1 else 0 end) as type_2, sum(deposited) as deposited, sum(collected) as collected from ((select site, type, 0 as deposited, 0 as collected from table1 ) union all (select site, null, (case when deposited is not null then 1 else 0 end), (case when collected is not null then 1 else 0 end) from table2 ) ) t12 group by site;