Bonjour,

J'ai développé une application de facturation et dans un écran, je souhaite, en une seule requête, récupérer l'état de ma facturation. Je lance donc la requête suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
select 
	f.CleFacture,
	f.DocumentFacture,
	f.DateFacture,
	tf.TypeFactureLibelle,
	f.NumerFacture,
	c.NomClient AS NomClient,
	sum((case when ((coalesce(te.CleTypeEcriture, 0) = 1) and (e.EcritureSupprimee = 0)) then ((e.QuantiteFacturee * e.PrixFacture) * te.Multiplicateur) else 0 end)) AS `Somme1`,
	sum((case when ((coalesce(te.CleTypeEcriture, 0) = 2) and (e.EcritureSupprimee = 0)) then ((e.QuantiteFacturee * e.PrixFacture) * te.Multiplicateur) else 0 end)) AS `Somme2`,
	sum((case when ((coalesce(te.CleTypeEcriture, 0) = 3) and (e.EcritureSupprimee = 0)) then ((e.QuantiteFacturee * e.PrixFacture) * te.Multiplicateur) else 0 end)) AS `Somme3`,
	sum((case when ((coalesce(te.CleTypeEcriture, 0) = 4) and (e.EcritureSupprimee = 0)) then ((e.QuantiteFacturee * e.PrixFacture) * te.Multiplicateur) else 0 end)) AS `Somme4`,
	coalesce(f.TotalFacture, 0) AS TotalFacture,
	coalesce(f.TotalFactureTTC, 0) AS TotalFactureTTC,
	coalesce(
		(
			select sum(coalesce(r.MontantReglement, 0)) 
				from 
					reglement 
				where 
					(
						(r.CleFacture = f.CleFacture) and 
						(r.ReglementActif = 1) and 
						(coalesce(r.ReglementSupprime, 0) = 0))
		), 0
	) AS MontantRegle,
	(
		f.TotalFactureTTC - 
		coalesce(
			(
				select sum(coalesce(r.MontantReglement, 0)) 
				from reglement 
				where 
					(
						(r.CleFacture = f.CleFacture) and 
						(r.ReglementActif = 1) and 
						(coalesce(r.ReglementSupprime, 0) = 0))
				), 0)
	) AS MontantRestant,
	f.StatutFacture,
	f.Domaine,
	coalesce(a.MontantAvoir, 0) as MontantAvoir,
	coalesce(a.MontantAvoirTTC, 0) as MontantAvoirTTC,
	f.MontantFactureInitial,
	f.MontantFactureTTCInitial,
	(
		select r.DateReglement
		from reglement 
		where 
		(
			(r.CleFacture = f.CleFacture) and 
			(r.ReglementActif = 1) and 
			(coalesce(r.ReglementSupprime, 0) = 0)
		) 
		order by r.DateReglement desc limit 0, 1
	) AS DateReglement,
	m.LibelleModeleFacture,
	f.NomFacture,
	a.NomAvoir
from 
	facture f left join 
	ecriture on e.CleFacture = f.CleFacture left join 
	typefacture tf on f.CleTF = tf.CleTF left join 
	typeEcriture te on e.CleTypeEcriture = te.CleTypeEcriture left join 
	client c on f.CleClient = c.CleClient left join 
	reglement r on f.CleFacture = r.CleFacture left join 
	avoir a on f.CleFacture = a.CleFacture left join 
	modeleFacture on f.CleModele = m.CleModele
 
	where (f.StatutFacture > 0)  AND (f.CleFacture = 133)
	group by 
		f.NumeroFacture,
		f.Domaine;
Cette requête fonctionne très bien SAUF que lorsque j'ai plusieurs enregistrement dans reglement pour la même facture, la valeur de Somme1 est doublée... le truc improbable quoi...

Après plusieurs décompositions de cette requête, il semble que ce soit cette partie là qui pose souci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
left join 
	reglement r on f.CleFacture = r.CleFacture
Pourtant je fais bien un left join entre la cle de ma facture et les écriture de la tables règlements qui contiennent la clé de ma facture...

Je cherche depuis un moment, mais en vain... Des yeux extérieurs verraient-ils quelque chose ? (parce que les miens commencent à vriller...)

Merci de votre avis !