Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/01/2012, 15h08   #1
Membre habitué
 
Avatar de grinder59
 
Inscription : septembre 2005
Messages : 514
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 514
Points : 128
Points : 128
Par défaut LEFT JOIN sur une même table

Bonjour,

j'ai un petit souci de conception d'une requête qui ne me renvoie pas le résultat attendu. Je dispose d'une table de FACTURE et d'une table ECRITURE composées de la façon suivante :

FACTURE :
FACTURE_ID
FACTURE_NUMERO
...

ECRITURE :
ECRITURE_ID
ECRITURE_TYPE
FACTURE_ID
ECRITURE_MONTANT
...

Une écriture peut avoir 4 types. L'objectif de ma requête est de sortir, par facture, la somme des écritures par type.

J'ai essayé ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
	FACTU_NUMERO,
	SUM(e1.ECRITURE_MONTANT),
	SUM(e2.ECRITURE_MONTANT),
	SUM(e3.ECRITURE_MONTANT),
	SUM(e4.ECRITURE_MONTANT)
FROM
	FACTURE LEFT JOIN 
	ECRITURE AS e1 ON FACTURE.FACTURE_ID = e1.FACTURE_ID LEFT JOIN 
	ECRITURE AS e2 ON FACTURE.FACTURE_ID = e2.FACTURE_ID LEFT JOIN 
	ECRITURE AS e3 ON FACTURE.FACTURE_ID = e3.FACTURE_ID LEFT JOIN 
	ECRITURE AS e4 ON FACTURE.FACTURE_ID = e4.FACTURE_ID
WHERE 
	e1.ECRITURE_TYPE = 1 AND 
	e2.ECRITURE_TYPE = 2 AND 
	e3.ECRITURE_TYPE = 3 AND 
	e4.ECRITURE_TYPE = 4 
GROUP BY FACTU_NUMERO
Le souci est que je n'ai, comme résultat, que les factures qui ont des écritures dans les 4 catégories...

Auriez-vous une idée ?

Merci de votre aide !
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 15h27   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
bonjour,

Alors votre problème vient du fait que vous mettiez les conditions de restrictions dans votre clause WHERE. De ce fait les jointures externes se transforment en jointure internes.

Donc il faut dépalcer ces conditions de restrictrion dans la clause de jointure.

Ceci étant dit votre requête n'est pas bien écrite, vous faites 4 jointures alors qu'une seule suffirait :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT a.FACTU_NUMERO,
	SUM(case when coalesce(ECRITURE_TYPE, 0) = 1 then e1.ECRITURE_MONTANT else 0 end),
	SUM(case when coalesce(ECRITURE_TYPE, 0) = 2 then e1.ECRITURE_MONTANT else 0 end),
	SUM(case when coalesce(ECRITURE_TYPE, 0) = 3 then e1.ECRITURE_MONTANT else 0 end),
	SUM(case when coalesce(ECRITURE_TYPE, 0) = 4 then e1.ECRITURE_MONTANT else 0 end)
FROM FACTURE a
	LEFT JOIN 	ECRITURE AS e1 ON a.FACTURE_ID = e1.FACTURE_ID  
GROUP BY a.FACTU_NUMERO
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 15h30   #3
Membre habitué
 
Avatar de grinder59
 
Inscription : septembre 2005
Messages : 514
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 514
Points : 128
Points : 128
Evidemment...
Merci beaucoup !
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h28.


 
 
 
 
Partenaires

Hébergement Web