我有两个表,一个表包含客户及其ID,另一个表包含订单以及包含客户ID的订单信息。问题是,不是每个客户都下订单,所以当我加入时,他们相应的行会丢失
此外,我想对联接表执行group by子句以计算每笔订单花费的总金额,因此,即使我退出联接,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
答案 0 :(得分:2)
您想要外部联接。您应该从要保留所有行的表开始,然后使用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
。答案 1 :(得分:0)
似乎您需要在right join
之前使用alp_customer on ..
答案 2 :(得分:0)
您还可以通过更改表的顺序并使用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