Bonjour à tous,
J'aurais besoin de l'aide d'experts pour me tripatouiller de cette requête sur laquelle je suis depuis quelques heures (et on se moque pas)
Objectif:
---------
J'ai deux tables: (je degage tout ce qui sert à rien)Pour un client donné, afficher la somme des reglements recus selon l'état courrant du dossier
T_Dossiers, T_Reglements
T_Dossiers
-------------
Num_Client -> le numéro du client auquel appartient le dossier
Num_Dos -> la clé primaire du dossier
Montant -> le montant du dossier
Etat -> l'etat du dossier (pause, terminé, fini, etc)
T_Reglements
--------------
Reg_id => clé primaire des réglements
Num_Deb => num client qui possede le dossier qui possede ce reglement
Num_Dos => Dossier auquel se rapport le reglement
Montant => montant du reglement
Date => date du reglement
On peut déjà constater un champ Num_Deb totalement inutile et je peux vous dire que la BDD en possède des dizaines comme ca. elle est mal foutue dans tous les sens avec des duplications de champs par milliers MAIS je n'ai pas le droit de modifier la base. Les champs ont les même noms mais les relations n'ont même pas été codées dans la base donc les contraintes, c'est de l'optionnel pour le developpeur de cette boite
Bref, je pensais avoir la solution avec une requête de la forme:
malheureusement comme un dossier peut avoir plusieurs règlements, ca multiplie le nombre d'enregistrements et donc les calculs et je me retrouve avec un nombre de dossier trop grand puis des calculs de somme faux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT T_Dossier.Etat, Count(T_Dossier.Num_Deb) AS [Nbre de dossiers], Format(Sum(CCur(IIf(IsNull(T_Reglement.Montant),0,T_Reglement.Montant))),'# 0.00') AS Encaisse, Format(Sum(CCur(T_Dossier.Montant)),'# 0.00') AS [Montant confié] FROM T_Dossier LEFT JOIN T_Reglement ON T_Dossier.Num_Dos = T_Reglement.Num_Dos WHERE (((T_Dossier.Num_Client)=6024)) GROUP BY T_Dossier.Etat;
Donc j'ai voulu faire par étapes:
==> 1618 dossiers
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT count(Dossier.Num_Dos) FROM Dossier WHERE Num_Client=6024;
==> 1628 dossiers
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT COUNT(Dossier.Num_Dos) FROM Dossier LEFT JOIN Reglement ON Dossier.Num_Dos = Reglement.Num_Dos WHERE Num_Client=6024
10 de plus. pourquoi?
Il y a 10 dossiers ayant 2 reglements
et 3 dossiers ayant 3 reglements.
donc j'aurais eu +13dossiers ou +16, j'aurais pu éventuellement trouver une explication mais là...
J'ai pensé à un regroupement mais lequel? que je teste par dossier, debiteur ou même par client, dès que je fais la jointure entre Dossier et Reglement, j'ai une erreur de compte. Comme beaucoup de dossiers n'ont pas de reglement, la LEFT JOIN est obligatoire.
Si quelqu'un avait le temps de me donner un coup de main![]()
je lui en serait très reconnaissant
Partager