I have these two tables
date |
---|
2017-1 |
2017-2 |
2017-3 |
2017-4 |
2017-5 |
2017-6 |
and
date | customer | no_orders |
---|---|---|
2017-1 | 156 | 1 |
2017-3 | 156 | 5 |
2017-5 | 156 | 4 |
2017-6 | 156 | 2 |
How can I join these two tables to have one row for each customer for all the dates same as below?
date | customer | no_orders |
---|---|---|
2017-1 | 156 | 1 |
2017-2 | 156 | 0 |
2017-3 | 156 | 5 |
2017-4 | 156 | 0 |
2017-5 | 156 | 4 |
2017-6 | 156 | 2 |
CodePudding user response:
We can use the following calendar table approach:
SELECT d.date, c.customer, COALESCE(t.no_orders, 0) AS no_orders
FROM dates d
CROSS JOIN (SELECT DISTINCT customer FROM customers) c
LEFT JOIN customers t
ON t.date = d.date AND
t.customer = c.customer
ORDER BY c.customer, d.date;
This assumes that the first table is called dates
and the second table customers
. The query works by using a cross join to generate a set of all dates and customers. We then left join to the second table to bring in the number of orders for a given customer on a given day. Absent number of orders are reported as zero.