#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