Объединение с таблицей, в которой отсутствуют некоторые значения

#sql #join #group-by

#sql #Присоединиться #группировать по

Вопрос:

У меня есть две таблицы, одна из которых содержит клиентов и их идентификатор, а другая содержит заказы с информацией о заказе, включая идентификатор клиентов. Проблема в том, что не каждый клиент сделал заказ, поэтому, когда я делаю объединение, их соответствующие строки отсутствуют

Кроме того, я хочу создать предложение group by в объединенной таблице, чтобы рассчитать общую сумму, потраченную на заказ, поэтому, даже если я выполню left join, group by по-прежнему не учитывает клиентов, которые не выполняли никаких заказов. Как я могу это исправить?

Мой запрос:

 select alp_customer.first, alp_customer.last, alp_customer.email, sum(alp_orderline.order_price)
from alp_orderline
inner join alp_orders on alp_orderline.order_id = alp_orders.order_id
inner join alp_customer on alp_orders.cust_id = alp_customer.cust_id
group by alp_customer.first, alp_customer.last, alp_customer.email
  

Вывод:
Таблица

Желаемый результат:

 Cindy - Jones - XXX@hotmail.com - 307.94
Mitch - Edwards - XXX@gmail.com - 64
Betty - Sorenson - XXX@yahoo.com - 231
Fourth - Guy - his mail - 0
  

Ответ №1:

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

 select c.first, c.last, c.email, coalesce(sum(ol.order_price), 0)
from alp_customer c left join
     alp_orders o
     on o.cust_id = c.cust_id left join
     alp_orderline ol
     on ol.order_id = o.order_id
group by c.first, c.last, c.email;
  

Примечания:

  • coalesce() Заменяет NULL результат на 0 , который вы, кажется, хотите.
  • Это вводит псевдонимы таблиц, поэтому запрос легче записывать и читать.
  • Это начинается с таблицы customers, потому что вам нужны все клиенты. И все последующие объединения являются left join s.

Ответ №2:

Кажется, вам нужно использовать right join непосредственно перед alp_customer on ..

Ответ №3:

Вы также можете сделать это, изменив порядок таблиц и используя LEFT JOIN следующее.

 select alp_customer.first, alp_customer.last, alp_customer.email, sum(alp_orderline.order_price)
from alp_customer
left join alp_orderline on alp_orders.cust_id = alp_customer.cust_id
left join alp_orders on alp_orderline.order_id = alp_orders.order_id
group by alp_customer.first, alp_customer.last, alp_customer.email