I have 2 tables:
Table 1 "contract" is as the following (sample only):
| contract_id | contract_status |
|---|---|
| 111 | Active |
| 122 | Active |
| 133 | Finished |
| 144 | Active |
| 155 | Finished |
contract_status values are: Active and Finished
Table 2 "ledger" is as the following (sample only):
| ledger_id | contract_id | ledger_status | amount |
|---|---|---|---|
| 1gh | 111 | WAIVED | 450 |
| 2uk | 111 | PAID | 0 |
| 2jz | 111 | WAIVED | 200 |
| 4bc | 122 | PAID | 0 |
| 5jw | 122 | UNPAID | 150 |
| 3xs | 133 | PAID | 0 |
| 9kd | 133 | WAIVED | 250 |
| 7bf | 144 | WAIVED | 100 |
| 8aq | 155 | UNPAID | 700 |
One contract can have a lot of ledger_id
How can I calculate the total amount that has been waived for each contract status (active and finished)?
Expected output
| contract_status | total_amount_waived |
|---|---|
| Active | 750 |
| Finished | 250 |
>Solution :
We can try a join aggregation approach:
SELECT c.contract_status, COALESCE(SUM(l.amount), 0) AS total_amount_waived
FROM contract c
LEFT JOIN ledger l
ON l.contract_id = c.contract_id AND
l.ledger_status = 'WAIVED'
GROUP BY c.contract_status;