Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 07/11/2006, 13h02   #1
TangoZoulou
Membre du Club
 
Développeur informatique
Inscription : septembre 2005
Messages : 145
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2005
Messages : 145
Points : 47
Points : 47
Par défaut [SQL Server] jointure externe et SUM

Bonjour a tous,

je souhaite faire faire des jointures externe entre 3 tables et je recupere de ces tables les fonctions SUM().

Mon probleme est que cela fonction quand je le fais sur les tables séparement c'est a dire juste entre 2 tables mais quand je fais ma requete avec les 2 jointures externes, il ne me sort pas les bon resultats...

voic ma requete
Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT
  Vue_Ctr_Anniversaire."Contract No_",
  SUM(Vue_Client_Facture_Avoir.Total_HT) AS "Facturé",
  SUM(Excel_CTR_FACTU_SPEC_Avoirs."TOTAL AVOIR") AS "TOTAL AVOIR"
FROM
  Vue_Ctr_Anniversaire
	LEFT JOIN Excel_CTR_FACTU_SPEC_Avoirs ON ( Vue_Ctr_Anniversaire."Contract No_"=Excel_CTR_FACTU_SPEC_Avoirs."CONTRAT 2006")
	LEFT JOIN Vue_Client_Facture_Avoir ON ( Vue_Ctr_Anniversaire."Contract No_"=Vue_Client_Facture_Avoir."No Affaire ")
GROUP BY
  Vue_Ctr_Anniversaire."Contract No_"
je dois avoir un probleme au niveau des jointure mais je ne sais pas où?

Merci pour votre aide

Tzoulou
TangoZoulou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 13h44   #2
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 929
Points : 3 929
Envoyer un message via Skype™ à Xo
Salut,

Merci de respecter les CONSEILS... à lire AVANT de POSTER et de préciser ton SGBD stp

Citation:
Envoyé par TangoZoulou
il ne me sort pas les bon resultats...
C'est à dire ? Il te manque des lignes ? Ou les totaux sont faux ?

Je pense qu'il faudrait que tu applique une fonction COALESCE (ou autre selon ton SGBD) qui transforme les valeur NULL en 0.

Ex :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT
  Vue_Ctr_Anniversaire."Contract No_",
  SUM(COALESCE(Vue_Client_Facture_Avoir.Total_HT, 0)) AS "Facturé",
  SUM(COALESCE(Excel_CTR_FACTU_SPEC_Avoirs."TOTAL AVOIR", 0)) AS "TOTAL AVOIR"
FROM
  Vue_Ctr_Anniversaire
    LEFT JOIN Excel_CTR_FACTU_SPEC_Avoirs ON ( Vue_Ctr_Anniversaire."Contract No_"=Excel_CTR_FACTU_SPEC_Avoirs."CONTRAT 2006")
    LEFT JOIN Vue_Client_Facture_Avoir ON ( Vue_Ctr_Anniversaire."Contract No_"=Vue_Client_Facture_Avoir."No Affaire ")
GROUP BY
  Vue_Ctr_Anniversaire."Contract No_"
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 13h59   #3
TangoZoulou
Membre du Club
 
Développeur informatique
Inscription : septembre 2005
Messages : 145
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2005
Messages : 145
Points : 47
Points : 47
désolé, je suis sur SQL server


1) les resultats qu'il me resort sont faux car il double tout. quand je fais ces requete separement les resultats sont bon mais quand je les assemble il fait la somme des doublons donc j'ai essayé de passer par SUM(DISTINCT) mais dans ce cas il me supprime certain doublon qui ne sont pas de doublons du au mauvais resultats

2) voila ce que je veux au final
j'ai une table avec deux champs principaux
Vue_Client_Facture_Avoir (contrat, Facturé)
Excel_CTR_FACTU_SPEC_Avoirs (contrat, Avoir)

je veux faire la somme des Facturé par contrat donc SUM avec un GROUP BY
et meme chose pour Excel_CTR_FACTU_SPEC_Avoirs

et une fois les sommes effectués je veux les regroupe avec une autre table pour avoir par contrat
mes infos venant de Vue_Ctr_Anniversaire et le total de facture et d'avoir par contrat

j'espere etre assez clair si ce n'est pas le cas dites le moi

Merci
TangoZoulou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 14h10   #4
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 929
Points : 3 929
Envoyer un message via Skype™ à Xo
c'est normal qu'il double les résultats, fais ta requête sans les SUM et le GROUP BY, et cumule les lignes, tu obtiendras bien le double de tes montants si tu as un enregistrement dans chacune de tes table "Avoir".

La solution passe par des sous-requêtes, qui vont te calculer tes montants : est-ce que la requête ci-dessous te ramène un résultat juste ?

Code :
1
2
3
4
5
6
7
SELECT
    Vue_Ctr_Anniversaire."Contract No_",
    (SELECT SUM(COALESCE(Vue_Client_Facture_Avoir.Total_HT, 0))
       FROM Vue_Client_Facture_Avoir 
      WHERE Vue_Ctr_Anniversaire."Contract No_" = Vue_Client_Facture_Avoir."No Affaire ") "Facturé"
FROM
    Vue_Ctr_Anniversaire
Si oui, tu n'a plus qu'à rajouter la sous-requête correspondant à la table Excel_CTR_FACTU_SPEC_Avoirs,
Si non, explique-nous tes soucis
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 14h29   #5
TangoZoulou
Membre du Club
 
Développeur informatique
Inscription : septembre 2005
Messages : 145
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2005
Messages : 145
Points : 47
Points : 47
ta solution passe, je ne savais pas qu'on pouvait lié les conditions d'une sous requete avec la requete mere, je suis etonné...
et ton group by et sous entendu par le lien entre la requete et la sous requete pas mal !
mais c'est assez chaud !


moi j'etais parti sur une autre piste car l'execution est assez longue.

toujour en faisant une jointure mais au lieu de faire reference a une table je fais reference a une sous requete dis moi ce que tu en penses ca marche pour un maintenant je teste pour voir avec les 2

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT
  Vue_Ctr_Anniversaire."Contract No_",
   test.Facturé
FROM
  Vue_Ctr_Anniversaire
LEFT JOIN (	
	SELECT Vue_Ctr_Anniversaire."Contract No_"  , SUM(Vue_Client_Facture_Avoir.Total_HT) AS "Facturé" 
	FROM
	  Vue_Ctr_Anniversaire
	LEFT JOIN Vue_Client_Facture_Avoir
	ON ( Vue_Ctr_Anniversaire."Contract No_"=Vue_Client_Facture_Avoir."No Affaire "  
		AND mes conditions....))
	GROUP BY Vue_Ctr_Anniversaire."Contract No_") AS test 
ON ( Vue_Ctr_Anniversaire."Contract No_"=test."Contract No_")
TangoZoulou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 14h31   #6
TangoZoulou
Membre du Club
 
Développeur informatique
Inscription : septembre 2005
Messages : 145
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2005
Messages : 145
Points : 47
Points : 47
oui ca peut paraitre bizarre d'avoir deux fois la vue une fois dans la reqquete et une seconde fois dans la sous requete mais j'en ai besoin dans mes conditions
TangoZoulou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 15h13   #7
TangoZoulou
Membre du Club
 
Développeur informatique
Inscription : septembre 2005
Messages : 145
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2005
Messages : 145
Points : 47
Points : 47
Et bien cette solution a bien fonctionné, je ne sais pas si c'est tres academique mais en tout cas cela fonctionne j'ai donc fait des sous requete que j'ai lié a une table avec des jointures externes
bon il fallu que je synchronise quelques champs pour eviter des doublons mais tout est OK

Merci pour ton aide Xo
TangoZoulou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h06.


 
 
 
 
Partenaires

Hébergement Web