I have 2 tables Comapnies and Trades: Comapnies:
| Country | center |
|---|---|
| Absolute | Mathlands |
| Alice s.p. | Wonderland |
| Arcus t.g. | Mathlands |
| Lil Mermaid | Underwater Kingdom |
Trades:
| id | seller | buyer | value |
|---|---|---|---|
| 20120125 | Alice s.p. | Arcus t.g. | 100 |
| 20120216 | Lil Mermaid | Absolute | 30 |
| 20120217 | Lil Mermaid | Absolute | 50 |
| 20121107 | Lil Mermaid | Alice s.p. | 10 |
Query I used:
select country
,(select sum(value) from trades t1 where c.name = t1.buyer) as imports
,(select sum(value) from trades t2 where c.name = t2.seller) as exports
from companies c
group by country
order by country;
I am not getting the output as required.
required output:
| country | Export | Import |
|---|---|---|
| Mathlands | 30 | 180 |
| Nothingland | 0 | 0 |
| Underwater Kingdom | 90 | 0 |
| Wonderland | 100 | 40 |
What I am getting:
| country | Imports | Exports |
|---|---|---|
| Mathlands | 80 | NULL |
| Nothingland | NULL | NULL |
| Underwater Kingdom | NULL | 90 |
| Wonderland | 10 | 100 |
CodePudding user response:
You can use a conditional aggregation
select c.center
, sum(case c.Country when t.seller then value end) export
, sum(case c.Country when t.buyer then value end) import
from Comapnies c
left join Trades t on c.Country in (t.seller, t.buyer)
group by c.center
order by c.center;
I'm using col names from your sample data.
