J'ai deux tableaux, l'un contenant les clients et leur identifiant et l'autre contenant les commandes avec les informations de commande, y compris l'identifiant des clients. Le problème est que tous les clients n'ont pas passé une commande, donc lorsque je rejoins les lignes correspondantes, il manque
De plus, je souhaite faire une clause group by sur la table jointe pour calculer le montant total dépensé par commande, même si je le fais left join, group by omet toujours les clients qui n'ont effectué aucune commande. Comment puis-je résoudre ce problème?
Ma requête:
Cindy - Jones - XXX@hotmail.com - 307.94 Mitch - Edwards - XXX@gmail.com - 64 Betty - Sorenson - XXX@yahoo.com - 231 Fourth - Guy - his mail - 0
Sortie souhaitée:
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
3 Réponses :
Il semble que vous deviez utiliser une jointure droite
juste avant alp_customer sur ..
Vous voulez des jointures externes. Vous devez commencer par le tableau dans lequel vous souhaitez conserver toutes les lignes, puis utiliser jointure gauche
:
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;
Remarques:
coalesce ()
remplace le résultat NULL
par 0
, ce que vous semblez vouloir. jointures de gauche
. Vous pouvez également le faire en changeant l'ordre du tableau et en utilisant LEFT JOIN
comme suit.
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