← All SQL interview questions
Weekly completed deliveries per partner, idle ones included
MediumJoins — Left/Right Outer JoinSwiggyOla
A city operations head wants a weekly productivity report for every delivery partner, including partners who did not complete a single delivery that week.
From delivery_partners and deliveries, return partner_name and completed_deliveries: the number of deliveries with status COMPLETED made between 2026-10-12 and 2026-10-18 (inclusive). Partners with none must appear with 0. Order by completed_deliveries descending, then partner_name.
Sample data
Table: delivery_partners
8 row(s)
| partner_idINT | partner_nameTEXT | cityTEXT |
|---|---|---|
| 1 | Rohit Sharma | Delhi |
| 2 | Sunil Kumar | Mumbai |
| 3 | Vikram Singh | Bengaluru |
| 4 | Amit Patil | Pune |
| 5 | Farida Khan | Hyderabad |
| 6 | Naveen Reddy | Chennai |
| 7 | Pooja Das | Kolkata |
| 8 | Manoj Tiwari | Lucknow |
Table: deliveries
18 row(s) · showing first 8
| delivery_idINT | partner_idINT | delivered_onDATE | statusTEXT |
|---|---|---|---|
| 1 | 1 | 2026-10-12 | COMPLETED |
| 2 | 1 | 2026-10-13 | COMPLETED |
| 3 | 1 | 2026-10-14 | CANCELLED |
| 4 | 2 | 2026-10-15 | COMPLETED |
| 5 | 2 | 2026-10-09 | COMPLETED |
| 6 | 3 | 2026-10-16 | COMPLETED |
| 7 | 3 | 2026-10-17 | COMPLETED |
| 8 | 3 | 2026-10-18 | COMPLETED |
delivery_partners
- partner_idINT
- partner_nameTEXT
- cityTEXT
deliveries
- delivery_idINT
- partner_idINT
- delivered_onDATE
- statusTEXT
- Step 1: Use `LEFT JOIN` from `delivery_partners` so every partner stays in the result.
- Step 2: Put the status and date conditions in the `ON` clause. If they go in `WHERE`, rows with no matching delivery are removed and the partner disappears, which turns the outer join into an inner join.
- Step 3: `COUNT(d.delivery_id)` counts only matched rows, so idle partners correctly get 0; `COUNT(*)` would return 1 for them.
SELECT dp.partner_name,
COUNT(d.delivery_id) AS completed_deliveries
FROM delivery_partners dp
LEFT JOIN deliveries d
ON d.partner_id = dp.partner_id
AND d.status = 'COMPLETED'
AND d.delivered_on BETWEEN DATE '2026-10-12' AND DATE '2026-10-18'
GROUP BY dp.partner_id, dp.partner_name
ORDER BY completed_deliveries DESC, dp.partner_name;More Joins — Left/Right Outer Join questions
Practising alone only goes so far — our live cohorts pair SQL depth with dashboards, agentic analytics projects and mock interviews.
Explore the program