#sql #postgresql
Вопрос:
У меня есть 2 таблицы, одна из которых содержит информацию о заказе, а другая-информацию о событии заказа, пример структуры ниже:
Таблица Заказов:
идентификатор продавца | идентификатор заказа | сумма | дата заказа |
---|---|---|---|
111111 | 123456 | 100 | 2021-07-01 |
111111 | 789012 | 50 | 2021-07-20 |
111111 | 642443 | 75 | 2021-08-12 |
Таблица Событий:
идентификатор продавца | идентификатор заказа | событие | сумма | Дата |
---|---|---|---|---|
111111 | 789012 | истечение | 50 | 2021-08-03 |
111111 | 642443 | истечение | 75 | 2021-08-28 |
Желаемый Результат:
Я пытаюсь получить разбивку по идентификатору продавца и месяцу:
- Количество заказов
- Сумма заказа
- Количество истечения срока действия (количество заказов, размещенных в этом месяце, истекло независимо от даты истечения срока действия)
- Сумма истечения срока действия (значение количества истечения срока действия выше)
Пример Вывода:
идентификатор продавца | заказ_месяц | order_count | order_sum | истекло количество | истекает_сум |
---|---|---|---|---|---|
111111 | 7 | 3 | 150 | 1 | 50 |
111111 | 8 | 1 | 75 | 1 | 50 |
Я попробовал несколько запросов без успеха, самое большее, что я получил, это:
select o.merchant_id, extract(month from o.order_date) as order_month, count(o.order_id) as order_count, sum(o.order_amount) as order_sum, count(e.order_id) as expiry_count, sum(e.amount) as expiry_sum from orders o left join events e on e.order_id = o.order_id where o.merchant_id = '111111' and o.order_date gt;= '2021-07-01' group by o.merchant_id, order_month order by o.merchant_id, order_month
Однако это выводит точно такие же значения для order_count и expiry_count, а также order_sum и expiry_sum. Кроме того, мне нужно извлекать только события, в которых event = 'EXPIRY'
, однако, я не получаю результатов при добавлении этого фильтра.
Любая помощь будет очень признательна!
Ответ №1:
Добавьте условие в event
соединение (не где):
select o.merchant_id, extract(month from o.order_date) as order_month, count(o.order_id) as order_count, sum(o.order_amount) as order_sum, count(e.order_id) as expiry_count, sum(e.amount) as expiry_sum from orders o left join events e on e.order_id = o.order_id and e.event = 'EXPIRY' where o.merchant_id = '111111' and o.order_date gt;= '2021-07-01' group by o.merchant_id, order_month order by o.merchant_id, order_month
Если вы ставите условие для внешней объединенной таблицы в предложении where, вы заставляете соединение вести себя как внутреннее соединение (как если бы вы удалили left
ключевое слово).
Комментарии:
1. Идеально! Большое вам спасибо @Bohemian!