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 07/02/2012, 11h14   #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 Problème de sum sur 2 tables différentes

Bonjour,

via 3 tables (écriture, facture, règlement), je tente de faire une réconciliation entre mes écritures, ma facture et mes règlements.

Chaque écriture dispose d'un type (frais, vente...) et je souhaite, par facture, sortir le montants des écritures par type et le montant des règlements.

Les écritures appartiennent à une facture et les règlements également. La table centrale est donc facture.

Voici ma requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
	  f.Numero
	, SUM(case when coalesce(typeE, 0) = 1 then (e.Montant) else 0 end) AS Somme1
	, SUM(case when coalesce(typeE, 0) = 2 then (e.Montant) else 0 end) AS Somme2
	, SUM(case when coalesce(typeE, 0) = 3 then (e.Montant) else 0 end) AS Somme3
	, SUM(case when coalesce(typeE, 0) = 4 then (e.Montant) else 0 end) AS Somme4
	, SUM(coalesce(r.Montant, 0)) AS MontantRegle
FROM 
	facture f LEFT JOIN
	ecriture e ON f.CleFacture = e.CleFacture LEFT JOIN
	reglement r ON f.CleFacture = r.CleFacture
GROUP BY
	f.Numero
Le problème est que si j'ai une facture qui comporte plusieurs écritures, MontantRegle sera multiplié par le nombre de ces écritures !

Ou me suis-je planté ?

Merci de votre aide !
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h32   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
Saluton,
Si tu ne peux avoir qu'un règlement par facture, tu peux t'en tirer comme ça
Code mysql :
1
2
3
AVG(SUM(coalesce(r.Montant, 0))) AS MontantRegle
// ou peut-être
SUM(coalesce(r.Montant, 0)) / COUNT(DISTINCT r.CleFacture) AS MontantRegle
Mais il vaudrait mieux repenser la démarche pour trouver une solution moins bancale et plus pérenne.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h16   #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
En effet, ce n'est pas très propre comme façon de faire (surtout la première)...

Les factures peuvent avoir plusieurs écritures et plusieurs règlements. Mon but est d'avoir, par facture, la somme des règlement et la somme des écritures (par type). Je suis assez étonnée que cette double agrégation ne soit pas envisageable !

J'ai même envisagé le schéma suivant :

ecritures <=> facture f1 <=> facture f2 <=> reglements

afin d'avoir d'un côté la somme des écritures et de l'autre la somme des règlements, et lier les deux via la clé primaire des factures...

mais cela ne semble pas fonctionner non plus...
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 13h35   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 669
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 669
Points : 2 677
Points : 2 677
Bonjour,

Il faut passer par une sous requête et faire 2 group by d'affilé.

Vous agrégez des choux et des pattates donc forcément le résultat ne peut peut être qu'une soupe !
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h39.


 
 
 
 
Partenaires

Hébergement Web