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, problème de Montant (SUM) multiplié


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 31
    Points
    31
    Par défaut SQL, problème de Montant (SUM) multiplié
    J'ai un pb avec une requete sql,il n'y a pas d'erreur de syntaxe car elle s'execute bien mais je n'attends pas le bon resultat, il doit donc y avoir un pb de logique :

    Je veux selectionner les adherents (n°+nom) et la somme de leur volume et la somme de leur factures, le tout pour le mois de d'octobre et l'année 2005.

    La voila :

    SELECT ADHERENT.NUMERO,ADHERENT.NOM,SUM(VOLUME.VOLUASSU),SUM(FACTURE.MONTANT)
    FROM ADHERENT,VOLUME,FACTURE
    WHERE adherent.NUMERO= facture.NUMERO
    AND adherent.NUMERO= volume.NUMERO
    AND FACTURE.MOIS =10
    AND FACTURE.ANNEE=2005
    AND VOLUME.MOIS=10
    AND VOLUME.ANNEE=2005
    GROUP BY ADHERENT.NUMERO,ADHERENT.NOM

    Le resultat m'affiche un seul adherent et c'est normal car c'est le seul a avoir des factures pr octobre
    J'ai la bonne sommme pr les factures mais par contre pr les volumes j'ai le double de ce qui devrait y avoir. (et pr cet adherent j'ai remarqué que j'ai 2 factures), dc en fait ca ne doit pas passer qu'il y ai ds ma requete les jointures entre adherent et volume d'une part et adherent et facture d'autre part ?

    Voyez vous ce que je veux dire ?

    Merci

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Comme ça, ta requête m'a l'air correcte, même si c'est "plus propre" d'utiliser des JOIN pour les jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM ADHERENT
    JOIN FACTURE ON facture.NUMERO = adherent.NUMERO
    JOIN VOLUME ON volume.NUMERO = adherent.NUMERO
    et de réserver les WHERE pour les critères de recherche.

    Es-tu sûr que dans ta table, tes volumes ne figurent pas une fois pour chaque facture ??

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    Je comprends pas trop ta question mais par exemple si je fais la requete sur les volumes separement :

    select SUM(VOLUASSU) from VOLUME where numero ='CE140012' and volume.annee=2005 and volume.mois =10

    ca me donnne : 38000

    Alors qu'avec la "grosse" requete ca me donne le double, et si je rajoute une facture pour cet adhérent ca me donne le triple etc ..

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Normal si un adhérent à deux lignes dans factures et 3 dans Volume tes jointures vont générer 6 lignes et non une !

    Il y a plusieurs solutions dont :

    Cette requête était idiote voir plus loin.
    J'ai supposé que Numéro était la PK de ADHERENT.

    Cette requête va ramener (normalement) des résultats comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom      Volume   Facture
    Dupont   12       15
    Durand   12       NULL
    Dupond   NULL     25
    Dubois   NULL     NULL
    Si cela ne te convient pas il faut jouer avec les jointure interne-externe et avec des conditions dans le WHERE

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    Je comprends un peu ton resonnement mais la requete ne passe pas, le sgbd (mysql 4.1.x) me retourne :

    "Unknown column 'v.MOIS ' in 'on clause'"

    Alors que j'ai bien laissé les alias...
    Ce me fait ca pour tout les autres :
    AND v.ANNEE = 2005
    AND f.MOIS = 10
    AND f.ANNEE = 2005

    une idée ?

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT a.NUMERO,a.NOM, SommeVolume, SommeFacture 
    FROM ADHERENT a LEFT OUTER JOIN (SELECT Numero, SUM(VoluAssu) as SommeVolume 
                                     FROM VOLUME
                                     WHERE MOIS   = 10
                                       AND ANNEE  = 2005
                                     GROUP BY Numero) v ON a.NUMERO = v.NUMERO 
                    LEFT OUTER JOIN (SELECT Numero, SUM(Montant) as SommeFacture 
                                     FROM FACTURE 
                                     WHERE MOIS   = 10
                                       AND ANNEE  = 2005
                                     GROUP BY Numero) f ON a.NUMERO = f.NUMERO

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    Ca fonctionne impec'

    Par contre est possible de ne pas selectionner les NULL ?
    Car les sommes ne prennent bien en compte que les factures et volume d'octobre 2005 mais pour les adherents qui n'ont pas de factures pour cette periode ca affiche NULL

    J'ai essayé de rajouter HAVING SommeFacture is not null mais ca ne fait rien. Une joiture RIGHT ne change pas la donne non plus car la jointure se fait sur le numero adhérent..

    Une idée ?

    Merci encore

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom      Volume   Facture 
    Dupont   12       15 
    Durand   12       NULL 
    Dupond   NULL     25 
    Dubois   NULL     NULL
    Si tu ne veux que Dupont, il suffit de remplacer les LEFT OUTER JOIN par des INNER JOIN

    Si tu veux Dupont, Durand et Dupond, mais pas Dubois

    il faut laisser les LEFT OUTER JOIN et ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE SommeVolume  IS NOT NULL
       OR SommeFacture IS NOT NULL

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    Merci tout est ok !!

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 31
    Points
    31
    Par défaut
    J'ai une autre requete a faire un peu ds le meme style mais en plus difficile je pense, en tt cas je n'y arrive tjs pas

    Cette fois ci je veux également la somme des volumes et la somme des factures mais en fonction d'un groupe de factures. Et dans un groupe de facture il peut y avoir des années et mois differents.(alors que dans le 1er pb c'etait tjs la meme année et le meme mois). Si c'est le cas (annee et mois different pr un adherent) il faut afficher autant de fois l'adherent qu'il y a de couple année/mois different. le but étant d'afficher les diferrents volumes

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Nom    Annee Mois Volume Facture
    dupont 2005   11   100       50.5
    dupont 2005   12   200       20.5
    Durand 2004   2    250       19.5
    durand 2005    3    300       20.5

    j'ai essayé de faire ca (en m'inspirant de ta solution 1) mais je pars dans de mauvais délires je crois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT a.NUMERO,a.NOM, v.annee,v.mois,SommeVolume, SommeFacture 
    FROM ADHERENT a INNER JOIN (SELECT Numero, Annee,Mois,SUM(VoluAssu) as SommeVolume 
                                     FROM VOLUME 
                                     WHERE MOIS IN (SELECT DISTINCT(MOIS) FROM FACTURE WHERE GROUPE='A') AND ANNEE IN (SELECT DISTINCT(ANNEE) FROM FACTURE WHERE GROUPE='A')
                                     GROUP BY Numero,annee,mois) v ON a.NUMERO = v.NUMERO 
                    INNER JOIN (SELECT Numero, annee,mois,SUM(Montant) as SommeFacture 
                                     FROM FACTURE 
                                     WHERE GROUPE= 'A' 
                                     GROUP BY Numero,annee,mois) f ON a.NUMERO = f.NUMERO
    Dans la partie volume j'ai fait 2 sous requetes pour recuperer les mois et années correspondant au factures mais bon ca n'a pas trop l'air d'etre la solution... En vois tu une autre ?

Discussions similaires

  1. [SQL] problème de SUM dans un update
    Par _Jérôme_ dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/03/2007, 18h22
  2. [SQL] problème pour faire ma requete
    Par seb.briet dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/12/2004, 16h51
  3. [PL/SQL] problème de trigger
    Par Chuck67 dans le forum Oracle
    Réponses: 14
    Dernier message: 09/12/2004, 23h17
  4. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  5. [Debutant][Join Sql] problème de join
    Par ultimax dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2004, 12h01

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