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 :

SUM calcule mal pas avec un COUNT


Sujet :

Langage SQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut SUM calcule mal pas avec un COUNT
    Salut à tous,

    J'ai une requête du genre (je l'ai simplifiée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT NUMclient,SUM(montant), MTassurance, MtEncours, Sum(MTAssurance + MTEncours)
    FROM ECRITURE INNER JOIN CLIENT ON ECRITURE.NunClient=CLIENT.NumClient
    WHERE ECRITURE.Date='2008'
    GROUP BY ECRITURE.Date,ECRITURE.NumClient,CLIENT.MTAssurance,
    CLIENT.MTEncours
    ORDER By CLIENT.NumClient
    Le 2ème SUM est complétement faux. Exemple:
    MTAssurance = 1, et MTEncours=2 -->Sum(MTAssurance + MTEncours)me donne 20 ???!! je voudrais 3.
    Je soupçonne que cela vienne de mon group By. J'ai essayé d'y retirer CLIENT.MTAssurance, CLIENT.MTEncours.Mais ds ce cas SQL échoue en disant :
    "Serveur*: Msg 8120, Niveau 16, État 1, Ligne 18
    La colonne 'CLIENT.CT_Assurance' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY." (idem puur CLIENT.Encours)

    Je ne sais pas pourquoi il m'oblige à les mettre. Dans ts les tutoriaux que j'ai lu, je n'ai jamais lu que des group BY devenait obligatoire.

    Dans ma table ECRITURES= le tiers apparait plusieurs fois donc je supposse qu'il me totalise par autant de lignes.

    Auriez-vous une idée ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Que donnerait la requête suivante ?
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    WITH Cli AS 
        (
        SELECT
            CLIENT.NUMclient,
            CLIENT.MTassurance,
            CLIENT.MtEncours,
            CLIENT.MTAssurance + CLIENT.MTEncours MTtotal
        FROM
            CLIENT
        WHERE
            EXISTS (SELECT 1 FROM ECRITURE WHERE DATE = '2008'
                    AND ECRITURE.NumClient = CLIENT.NumClient)
        ),
        Ecr AS 
        (
        SELECT
            ECRITURE.NUMclient,
            SUM(ECRITURE.montant) Montant_Ecr,
        FROM
            ECRITURE
        WHERE
            ECRITURE.Date = '2008'
        GROUP BY
            ECRITURE.NumClient
        )
    SELECT
        Cli.NUMclient,
        Cli.MTassurance,
        Cli.MtEncours,
        Cli.MTtotal,
        Ecr.Montant_Ecr
    FROM
        Cli
        INNER JOIN Ecr
          ON Cli.NumClient = Ecr.NumClient
    ORDER BY
        Cli.NumClient

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    Idem :

    La colonne 'CLIENT.CT_Assurance' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY." (idem puur CLIENT.Encours)

    Dans le doute, j'ai inséré dans mon SELECT un COUNT (ECRITURE.CT_NUM)
    et c'est bien ce que je croyais : par exemple CT_NUM=TOTO apparait 5 fois donc il me fait (5 X3=15 + 5*1= 5 )= 20

    Alors j'ai essayé de changer ma formule en :
    SUM((CLIENT.MTAssurance + CLIENT.MTEncours)/ COUNT(ECRITURE.CLIENTNUM))
    j'obtiens :
    Serveur*: Msg 130, Niveau 15, État 1, Ligne 24
    Impossible d'exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous-requête.

    Savez-vous comment puis je réaliser ce calcul ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    J'ai modifié ma requête pour prendre en compte vos doublons.
    Ce serait plus simple avec la structure de vos tables...

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    re-salut @tibofo,

    Si tu ne mets pas le SUM et seulement (MTAssurance + MTEncours) !

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    Je voulais remercier DIEU et tous les cryptoniens de l'espace !!!

    MERCI d'avoir conçu ce forum qui m'aide trés souvent,
    Et MERCI d'avoir créer CHTULUS : 2 fois qu'il me dépanne aujourd'hui

    je serais une femme, je sais pas ce que je ferais pour te remercier....ouh la la , on s'égaaaaarrrrrrrrre

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/06/2010, 14h33
  2. Requêt avec sum ne donne pas le bon résultat§
    Par _cece dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/11/2008, 18h53
  3. Pas d'affichage des valeurs nulles avec un COUNT
    Par phoenixz22 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 30/05/2007, 18h39
  4. LIMIT calcul mal avec des JOIN
    Par FMaz dans le forum Requêtes
    Réponses: 21
    Dernier message: 12/07/2006, 03h37
  5. Réponses: 3
    Dernier message: 12/05/2003, 12h11

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