Bonjour,
J'ai recherché vainement dans le forum une astuce pour compter des éléments de deux tables en jointure gauche à une table principale. Malheureusement, mes comptes se multiplient entre eux. Un exemple sera plus parlant
J'ai une table panier, une table pomme et une table poire.
Dans mon panier, je peux avoir 0 à n Pommes ET/OU 0 à n Poires
Je veux connaitre pour mes paniers, leur clef informatique (clef primaire) et le nombre de pommes et de poires qu'il contiennent.
J'avais faussement pensé pouvoir faire :
soit (je viens de l'éditer suite à la remarque du post suivant)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT panier.id_panier, count(pomme.id_pomme), count(poire.id_poire) FROM panier,poire,pomme WHERE panier.id_panier = poire.id_panier (+) AND panier.id_panier = pomme.id_panier (+) GROUP BY panier.id_panier
Malheureusement dans le panier 1 j'ai 3 pommes et 2 poires.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT panier.id_panier, count(pomme.id_pomme), count(poire.id_poire) FROM panier LEFT OUTER JOIN pomme on panier.id_panier = pomme.id_panier LEFT OUTER JOIN poire on panier.id_panier = poire.id_panier GROUP BY panier.id_panier
J'obtiens logiquement 6 pommes et 6 poires en réponse ! (3*2)
C'est logique, j'ai 6 lignes retournées.
Alors en regardant la doc sqlpro, j'ai tenté cela :
Le principe était que si il y avait une pomme je sommais 1 (0 en cas de non présence) et si il y avait une poire ca donnait 1 et 0 sinon. Algorithmiquement, ca me semblait juste, mais cela me retourne exactement la même valeur : 6.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT panier.id_panier, SUM(CASE WHEN pomme.id_pomme > 0 THEN 1 ELSE 0 END), SUM(CASE WHEN poire.id_poire > 0 THEN 1 ELSE 0 END), FROM panier,poire,pomme WHERE panier.id_panier = poire.id_panier AND pomme.id_panier = poire.id_panier GROUP BY panier.id_panier
Auriez vous un moyen de compter le nombre de pommes et de poires en jointure gauche. (Les jointures sont ainsi car les paniers vides, ou les paniers n'ayant qu'un type de fruit doivent rentré dans ma table).
Autre subtilité, j'ai bien pensé à utiliser deux requêtes, mais techniquement, pour raisons diverses, je ne peux pas ! (même si je le voulais)
Partager