1
votes

Rejoindre une table où certaines valeurs manquent

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

Résultat: Table

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


0 commentaires

3 Réponses :


0
votes

Il semble que vous deviez utiliser une jointure droite juste avant alp_customer sur ..


0 commentaires

2
votes

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:

  • Le coalesce () remplace le résultat NULL par 0 , ce que vous semblez vouloir.
  • Ceci introduit les alias de table, donc la requête est plus facile à écrire et à lire.
  • Cela commence par la table des clients, car vous voulez tous les clients. Et toutes les jointures suivantes sont des jointures de gauche .


0 commentaires

0
votes

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


0 commentaires