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 :

Effectuer une somme sans doublon


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Points : 41
    Points
    41
    Par défaut Effectuer une somme sans doublon
    Bonjour,
    J'ai un petit souci de somme.
    J'ai 3 tables CLIENT (table client), ARTICLE (table des articles d'un client) et CLIENTCA (table des CA d'un client)

    Les jointures sur ces tables s'effectuent de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CLIENT.CLI = ARTICLE.CLI
    CLIENT.CLI = CLIENTCA.CLI
    Pour 1 client, il existe n ARTICLE
    Pour 1 client, il existe n CLIENTCA

    si je fais la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CLIENT.CLI, ARTICLE.CODART, SUM(CLIENTCA.MNTCA)
    FROM CLIENT, ARTICLE, CLIENTCA
    WHERE CLIENT.CLI = ARTICLE.CLI
    AND CLIENT.CLI = CLIENTCA.CLI
    AND CLIENTCA.ANNEE IN (2008, 2009)
    GROUP BY CLIENT.CLI, ARTICLE.CODART
    j'obtiens un résultat erroné, car 1 même client a 2 articles, donc le CA est doublé a chaque fois!

    Si je mets un SUM(DISTINCT CLIENTCA.MNTCA) mais que le CA pour 2008 et 2009 est le même, le résultat est également erroné car il n'est compté qu'une fois.

    Helpp
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Quel sens voulez-vous donner à votre requête, compte-tenu qu'il n'y a pas de relation entre le CA et les articles ?

    Comme vous dites, un client A, un CA à 1000 et deux articles.
    Que voulez-vous voir apparaître ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Informations dans la table CLIENT :
    CLI NOMCLI
    10 TOTO

    Informations dans la table CLIENTCA :
    CLI ANNEE MNTCA
    10 2008 10000
    10 2009 10000

    Informations dans la table ARTICLE :
    CLI CODART LIBART MNTART
    10 A1 Article1 10
    10 A2 Article 2 20

    Je veux avoir pour le client n° 10, la somme des montant d'articles qu'il possède et également la somme des CA pour 2008 et 2009 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CLIENT.CLI, SUM(ARTICLE.MNTART), SUM(CLIENTCA.MNTCA)
    FROM CLIENT, ARTICLE, CLIENTCA
    WHERE CLIENT.CLI = ARTICLE.CLI
    AND CLIENT.CLI = CLIENTCA.CLI
    AND CLIENTCA.ANNEE IN (2008, 2009)
    GROUP BY CLIENT.CLI, ARTICLE.CODART
    Résultat obtenu :
    10 30 40000
    Résultat attendu :
    10 30 20000

    PS: Toutes ces informations sont fictives, la somme de CA étant pour l'exemple car n'ayant pas réellement d'utilité.

    Merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez calculer les deux somme dans des sous-requêtes, et les joindre avec votre table client :
    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
     
    SELECT 
           c.cli,
           sumart.somme_mntart,
           sumca.somme_mntca
    from client c
    left join 
         (
          select 
                 c.cli, 
                 sum(a.mntart) as somme_mntart	  
          from client c
          join article a
          group by c.cli
         ) sumart ON sumart.cli = c.cli
    left join 
         (
          select 
                 c.cli, 
                 sum(ca.mntca) as somme_mntca	  
          from client c
          join clientca ca
          group by c.cli
         ) sumca ON sumca.cli = c.cli

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Super! Ca marche
    Merci à vous
    Bonne journée

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Pas besoin de remettre une seconde fois les clients Snipah, surtout quand il manque les jointures

    J'arrive à cette requête :
    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
    SELECT 
        cl.cli,
        coalesce(ar.mntar_tot, 0) as mntar_tot,
        coalesce(ca.mntca_tot, 0) as mntca_tot
    FROM
        client cl
        LEFT OUTER JOIN 
        (  SELECT cli, sum(mntart) AS mntar_tot      
             FROM article
         GROUP BY cli
        ) ar
          ON ar.cli = cl.cli
        LEFT OUTER JOIN 
         (  SELECT cli, sum(mntca) AS mntca_tot      
              FROM clientca
          GROUP BY cli
         ) ca
          ON ca.cli = cl.cli

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    En effet, jointure inutile et mal ecrite dans les sous-requête
    Merci pour la correction.

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

Discussions similaires

  1. n'arrive pas a recuperer mes id pour effectuer une somme
    Par CROSS dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/07/2007, 16h09
  2. Comment remplir une liste déroulante avec une macro sans doublons
    Par alex.a dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/06/2007, 19h34
  3. Récupérer valeurs d'une colonne sans doublons
    Par paflolo dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 17/10/2006, 15h19
  4. Réponses: 4
    Dernier message: 19/10/2005, 10h20
  5. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 16h56

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