Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 11/07/2011, 15h43   #1
Invité de passage
 
Homme Kylian Kevin
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Kylian Kevin
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
Par défaut Problème de doublon dans une jointure

Bonjour à tous,
Je suis en stage dans une Sté, et je dois ajouter des relances clients sur leur site intranet. Je ne dois en aucun cas toucher aux métadonnées car ils ont un progiciel qui fonctionne dessus.
Merci pour votre aide qui me sera bien utile.

NUMERO_CLIENT
DATE
TAUX_REMISE
TAUX_ESCOMPTE


FACTURE_LIGNE
NUMERO
NUMERO_FACTURE
NUMERO_TVA
QUANTITE
PRIX_UNIT
PRIX_TOTAL


TAXE
NUMERO
TAUX_TVA


REGLEMENT
NUMERO
DATE
MONTANT


REGLMENT_LIGNE
NUMERO
NUMERO_REGLEMENT
NUMERO_FACTURE


COUPON_REDUCTION
NUMERO
NUMERO_FACTURE
MONTANT


Je veux récupérer les clients qui n'ont pas réglé leurs factures
ainsi que le montant dû.
j'utilise cette requête mais j'ai quelques problèmes de doublon.
je précise si un client fait plusieurs règlements.
Merci pour votre aide.

Code :
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
 
SELECT
  C.NOM,  
  CAST  (  SUM ((LF.MONTANT_TOTAL * ((100 - F.TAUX_REMISE) / 100) * ((100 - F.TAUX_ESCOMPTE) / 100))  * (1 + (T.TVA_TAUX / 100)))
 - (COALESCE ( SUM (RG.MONTANT),0) + COALESCE (SUM(P.MONTANT),0) ) AS DECIMAL (10,2)) AS DU
 
FROM
 FACTURE F 
LEFT OUTER  JOIN CLIENT C  ON
  (C.NUMERO = F.NUMERO_CLIENT)
INNER JOIN FACTURE_LIGNE LF ON
  (F.NUMERO = LF.NUMERO_FACTURE)
INNER   JOIN TAXE T ON
  (LF.NUMERO_TVA = T.NUMERO )
LEFT OUTER  JOIN REGLEMENT_LIGNE LRG ON
 ( F.NUMERO = LRG.NUMERO_FACTURE)
LEFT OUTER  JOIN REGLEMENT RG ON
  (RG.NUMERO = LRG.NUMERO_REGLEMENT)
LEFT OUTER JOIN COUPON_REDUCTION P ON
 (F.NUMERO = P.NUMERO_FACTURE)
 
GROUP BY
 C.NOM
 
HAVING
  (                 
    (
     CAST  ( SUM ((LF.MONTANT  * ((100 - F.TAUX_REMISE) / 100) * ((100 - F.TAUX_ESCOMPTE) / 100))  * (1 + (T.TVA_TAUX / 100))) AS DECIMAL (10,2))
     )
     >
     (
     COALESCE ( SUM (RG.MONTANT)  + SUM(P.MONTANT),0)
     )
 
 
)
kvkylian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 16h33   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Quel est votre SGBDR ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 16h46   #3
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous groupez par nom de client ?? Pas par n° de client ??
Comment faites-vous pour des clients qui ont le même nom ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 17h43   #4
Invité de passage
 
Homme Kylian Kevin
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Kylian Kevin
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
Quel est votre SGBDR ?
Interbase

Yanika_bzh
J'ai essayé de grouper par le numéro et j'ai un message d'erreur
qui me dit il faut rajouter le nom
mais le reste est le même doublon

Doublon si il y a plusieurs règlements sur une même facture

Exp :
client jojo facture 100e
il fait 2 règlements 50e et 30e et doit normalement 20e alors que j'obtiens 120e
de plus si il y a un coupon de réduction 10e j'obtiens 100e au lieu de 90e
je me demande d'où peut bien venir se problème.
Merci pour votre aide.
merci à vous
kvkylian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 18h08   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Cela vient de votre jointure et de la façon dont vous calculez les sommes.

Pour reprendre rapidement votre exemple :
La Table facture contient une ligne : 100
La Table règlement contient deux lignes : 50 et 30

les deux lignes de reglement correspondent à la ligne de facture, votre jointure donne donc :
facture ; reglement
100 ; 50
100 ; 30
Ici, la somme des factures est de 200 (100 + 100), la somme des reglement est de 80 (50 + 30), reste dû : 120 (200 - 80),
CQFD, l'erreur est correcte


Vous pouvez donc par exemple faire des jointures sur des sous requêtes effectuant déjà les agrégats (somme) en regroupant sur la condition de jointure.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h01   #6
Membre expérimenté
 
Avatar de NicoL__
 
Homme Nicolas
Inscription : janvier 2011
Messages : 378
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations forums :
Inscription : janvier 2011
Messages : 378
Points : 528
Points : 528
Pour reprendre la remarque de Yanika_bzh il n'empêche qu'il faut aussi réaliser le group by par le numéro client :
Code :
1
2
 
GROUP BY C.NUMERO, C.NOM
Sinon il va y avoir des regroupements faux.
Sinon il vaut mieux faire des sous requêtes pour les règlements que des jointures pour éviter la démultiplication des lignes.
NicoL__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 17h18   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
J'avais un peu de temps devant moi, mais pas de base de données (vive le notepad)...
Donc je vous soumets ce qui pourrait ressembler à votre solution, mais je n'ai absolument pas testé cette requête.
Cependant, je pense que l'idée doit être là
Code :
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
SELECT 
	C.NUMERO,
	CNOM,
	SUM(DEBIT.MontantTotalFactureTTC  - (COALESCE(CREDIT.MontantTTCRegleFacture,0) )
FROM
 
/* Factures */
(SELECT 
	SUM(FL.PRIX_TOTAL)* 						/* Total HT */
	 ((100 - F.TAUX_REMISE) /100) * 				/* Moins la remise de la facture*/
	 ((100-F.TAUX_ESCOMPTE) /100)*  				/* Moins l'escompte de la facture */
	(1 + (T.TVA_TAUX / 100)) - 					/* TVA appliquée */
	SUM (COALSCE(CR.MONTANT,0)) AS 	MontantTotalFactureTTC 		/* Moins le montant des Réductions */
	FL.NUMERO_FACTURE						
FROM
	FACTURES_LIGNE FL 
	INNER JOIN 
		FACTURES F ON (F.NUMERO=FL.NUMERO_FACTURE)		/* Pour recuperer remise et escompte */
	INNER JOIN 
		TAXE T ON (T.NUMERO=FL.NUMERO_TAXE)			/* Pour recuperer TVA */
	LEFT OUTER JOIN 
		COUPON_REDUCTION CR ON (CR.NUMERO_FACTURE = F.NUMERO)	/* Pour recuperer les eventuelles reductions */
GROUP BY 
	FL.NUMERO_FACTURE ) AS DEBIT					/* DEBIT est le montant TTC du par Facture */
 
LEFT OUTER JOIN
/* Reglements associés */
(SELECT 
	SUM (R.MONTANT) AS MontantTTCRegleFacture,			/* Montant TTC des reglements */
	RL.NUMERO_FACTURE
FROM
	REGLMENT_LIGNE RL 
INNER JOIN 
	REGLEMENT R ON (RL.NUMERO_REGLEMENT=R.NUMERO)
GROUP BY 
	RL.NUMERO_FACTURE) AS CREDIT					/* CREDIT est le montant TTC réglé par facture */
 
ON (DEBIT.NUMERO_FACTURE = CREDIT.NUMERO_FACTURE)
INNER JOIN 
	FACTURES F ON (F.NUMERO = DEBIT.NUMERO_FACTURE)			/* Pour récupérer le Client */
INNER JOIN 
	CLIENTS C ON (C.NUMERO = F.NUMERO_CLIENT)			/* Pour récupérer le nom du client */
GROUP BY
	C.NUMERO, C.NOM							/* Regroupement par N° de client */
HAVING 
	/* Clients possédant un solde négatif */
	SUM(DEBIT.MontantTotalFactureTTC  - (COALESCE(CREDIT.MontantTTCRegleFacture,0) )>0
Je ne sais pas ce que cela vaut, j'ai commenté ma méthode.
A adapter et tester

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 12h37   #8
Invité de passage
 
Homme Kylian Kevin
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Kylian Kevin
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
merci merci merci merci merci merci yanika_bzh
je vais essayer de l'adapter
kvkylian est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h52.


 
 
 
 
Partenaires

Hébergement Web