Выберите количество и сумму из таблицы заказов, а также количество и сумму из таблицы событий, где идентификатор заказа совпадает

#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!