IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[SQL Server] jointure externe et SUM


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    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

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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_")

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    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

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 145
    Points : 77
    Points
    77
    Par défaut
    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

Discussions similaires

  1. [MySQL] requête SQL de jointure externe
    Par makamine dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/05/2011, 13h10
  2. [SQL Server]Jointure ou non
    Par javaboy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/05/2008, 11h12
  3. SQL Informix - Jointure externe
    Par dvi24 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2008, 15h25
  4. [SQL Server] "Jointure" avec histo inexistant
    Par Tankian dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/09/2006, 15h49
  5. [SQL Server] Jointure entre 2 tables et performances
    Par rmeuser dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/04/2006, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo