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

Requêtes MySQL Discussion :

SUM() sur 2 tables


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 52
    Par défaut SUM() sur 2 tables
    Bonjour à tous,

    2 tables avec clé commune :
    - factures (avec notamment le montant total)
    - factures_articles (car plusieurs articles par factures)


    Et j'aimerai sortir le total des factures par rapport à un article, j'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    	SUM(f.Total) AS TOT_HT
    FROM
    	factures f , factures_articles fa
    WHERE
    	fa.IdFacture = f.IdFacture AND
    	fa.IdArticle = 85

    Problème : si j'ai 3 articles sur une facture il me compte 3 fois le total !
    J'ai essayer un GROUP BY mais c'est pire.

    Peut-on calculer le total d'un champ quand on lit 2 tables ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    A quoi te sert la table des articles si tu n'utilise que le f.Total ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
    	SUM(f.Total) AS TOT_HT
    FROM
    	factures f

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 52
    Par défaut
    Pour le WHERE :

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    oui, bien sûr :

    Le CA généré par le produit 85 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM(fa.NbArticles * fa.PrixU) AS TOT_HT
    FROM factures f 
      INNER JOIN factures_articles fa ON fa.IdFacture = f.IdFacture 
    WHERE fa.IdArticle = 85
    Le CA généré par les factures incluant le produit 85 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SUM(f.Total) AS TOT_HT
    FROM factures f 
    WHERE f.IdFacture IN (SELECT fa.IdFacture 
      FROM factures_articles fa 
      WHERE fa.IdArticle = 85
    )

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 52
    Par défaut
    Puissant ce "IN", j'avais déjà vu mais jamais utilisé, c'est ce qu'il me fallait, super

    Merci Antoun

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    puissant mais très mal optimisé... si tu as des problèmes de perf, il est possible de le ré-écrire sous forme de sous-req DISTINCT dans le FROM...

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 52
    Par défaut
    Un DISTINCT c'est pas dans le SELECT ?

    Tu as un exemple stp ?

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM(f.Total) AS TOT_HT
    FROM factures f 
      INNER JOIN (SELECT DISTINCT fa.IdFacture FROM factures_articles fa WHERE fa.IdArticle = 85
    ) tmp

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Citation Envoyé par MagicManu Voir le message
    Problème : si j'ai 3 articles sur une facture il me compte 3 fois le total !
    J'ai essayer un GROUP BY mais c'est pire.
    C'est curieux qu'une simple requête, sans IN ou quoi que ce soit d'autre, ne donne pas le bon résultat...
    Tu peux avoir plusieurs fois le même article dans la même facture (même IdArticle plusieurs fois dans ta table factures_articles) ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 52
    Par défaut
    Antoun, merci pour cet exemple

    ced, plusieurs fois le même article sur une facture possible, le problème c'est que avec le GROUP BY ça me renvoie autant de ligne que de factures ! Et sans le GROUP BY ça me renvoie le total d'une facture multiplié par son nombre d'article (facture à 100€ avec 3 articles renvoi 300€).

    Donc la solution de Antoun "Le CA généré par les factures incluant le produit 85" est la bonne pour mon cas

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

Discussions similaires

  1. SUM sur trois tables
    Par charrynsasi dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/04/2012, 18h17
  2. Problème de sum sur 2 tables différentes
    Par grinder59 dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/02/2012, 13h35
  3. SUM sur deux tables
    Par grunk dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/11/2011, 17h06
  4. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58
  5. Sum de deux champs sur deux tables différentes
    Par kluh dans le forum Oracle
    Réponses: 11
    Dernier message: 29/09/2005, 18h21

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