Соединение с таблицей, где отсутствуют некоторые значения - PullRequest
0 голосов
/ 03 марта 2019

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

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

Мой запрос:

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

Вывод: Table

Желаемый вывод:

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

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Вы хотите внешние соединения.Вам следует начать с таблицы, в которой вы хотите сохранить все строки, а затем использовать 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, который вам нужен.
  • Это вводит псевдонимы таблиц, поэтому запрос легче писать и читать.
  • Он начинается с таблицы клиентов, потому что вы хотитевсе клиенты.И все последующие объединения - left join с.
0 голосов
/ 03 марта 2019

Вы также можете сделать это, изменив порядок таблицы и используя 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
0 голосов
/ 03 марта 2019

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

...