Вернуть 0 для всех отсутствующих комбинаций в объединенной таблице - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть 2 таблицы, временных рядов и заказов

таймсерия

+------------+
|  datetime  |
+------------+
| 2018-11-01 |
| 2018-11-02 |
| 2018-11-03 |
+------------+

Заказы

+------------+-------------+----------+
|  datetime  | customer_id | order_id |
+------------+-------------+----------+
| 2018-11-01 |           1 |        1 |
| 2018-11-02 |           1 |        2 |
| 2018-11-03 |           2 |        3 |
+------------+-------------+----------+

Я бы хотел получать количество заказов для каждого клиента в день.

Ожидаемые результаты:

+------------+-------------+--------------+
|  datetime  | customer_id | number_order |
+------------+-------------+--------------+
| 2018-11-01 |           1 |            1 |
| 2018-11-02 |           1 |            1 |
| 2018-11-03 |           1 |            0 |
| 2018-11-01 |           2 |            0 |
| 2018-11-02 |           2 |            0 |
| 2018-11-03 |           2 |            1 |
+------------+-------------+--------------+

Я попытался LEFT JOIN, но он не возвращает все временные ряды для всех клиентов

SELECT datetime, customer_id, COUNT(order_id) as number_order 
FROM timeseries
LEFT JOIN orders
ON timeseries.datetime = orders.datetime
GROUP BY datetime, customer_id
ORDER BY datetime, customer_id

>> Result

+------------+-------------+--------------+
|  datetime  | customer_id | number_order |
+------------+-------------+--------------+
| 2018-11-01 |           1 |            1 |
| 2018-11-02 |           1 |            1 |
| 2018-11-03 |           2 |            1 |
+------------+-------------+--------------+

Я понимаю, что только левое соединение обеспечивает возврат всех строк в таблице timeseries, но мне нужны все строки в таблице timeseries с каждым customer_id.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вам необходимо объединить все даты и всех клиентов, чтобы получить все возможные комбинации даты и идентификаторов клиентов. Затем осталось объединиться с заказами:

SELECT timeseries.datetime, customers.customer_id, COUNT(orders.order_id) as number_order
FROM timeseries
CROSS JOIN (SELECT DISTINCT customer_id FROM orders) AS customers
LEFT JOIN orders ON orders.datetime = timeseries.datetime AND orders.customer_id = customers.customer_id
GROUP BY timeseries.datetime, customers.customer_id
ORDER BY timeseries.datetime, customers.customer_id
0 голосов
/ 19 ноября 2018

используйте union all, затем left join

select t1.datetime,customer_id,COUNT(order_id) as number_order from 

(select datetime from  timeseries
union all
select datetime from orders
) t1 left join 
    orders  on t1.datetime=orders.datetime
group by  t1.datetime,customer_id
...