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 - GROUP BY


Sujet :

Requêtes MySQL

  1. #1
    Invité
    Invité(e)
    Par défaut SUM - GROUP BY
    Bonjour,

    J'ai 3 tables (je les simplifie) :
    FACTURES (id_facture, total, date)
    PROJETS (id_projet, description, id_client, id_facture)
    CLIENTS (id_client, client)

    Je souhaite faire une requête qui me donne la somme totale pour un mois donné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT sum(total) AS sum_facture 
    FROM FACTURES, CLIENTS, PROJETS 
    WHERE PROJETS.id_client=CLIENTS.id_client 
    AND PROJETS.id_facture = FACTURES.id_facture 
    AND date_format(date, "%m") LIKE "03" 
    AND date_format(date, "%Y") LIKE "2014"'
    Une facture peut avoir plusieurs projets donc forcément, un SUM dans cette configuration va additionner l'ensemble des lignes projets pour les factures trouvées à cette date.
    Si le total de la facture est à 250 € avec 3 projets, il me renvoi 750 ! (je comprends sa logique...)
    Si il y a 2 factures dans le mois à 100 et 150 €, il fait pareil que le cas du haut, il additionne l'ensemble des projets pour les factures...

    Si j'avais une seule facture dans le mois, je pourrais juste faire ça, et ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT total 
    FROM FACTURES, CLIENTS, PROJETS 
    WHERE PROJETS.id_client=CLIENTS.id_client 
    AND PROJETS.id_facture = FACTURES.id_facture 
    AND date_format(date, "%m") LIKE "03" 
    AND date_format(date, "%Y") LIKE "2014"' GROUP BY 1
    Mais vu que j'en ai plusieurs, y a-t-il une possibilité pour avoir la bonne info avec ce type de tables ?

    Je pense que c'est un truc tout con mais moins je pratique le SQL et plus j'oublie...

    Merci pour votre aide !
    Dernière modification par Invité ; 14/05/2014 à 09h47.

  2. #2
    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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Une remarque : les jointures ne s'écrivent plus en séparant les tables par des virgules depuis plus de 20 ans ; préférez la syntaxe INNER JOIN ... ON ....
    Sinon, pourquoi faites-vous des jointures sur les tables PROJET et CLIENT alors que vous voulez un total par mois et que les colonnes total et date sont toutes les deux dans la même table, à savoir FACTURE ?
    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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oups, petit oublie sur la requête mais qui ne gêne pas pour le problème, je peux être amené également à faire un choix sur une année avec un client sélectionné.

    Pour les jointures, j'avoue avoir appris comme ça, il faudrait que je change... Par contre, 20 ans, c'est pas exagéré ? , mon BTS info ne date que de 2002/2004 et on apprenait comme ça ! .
    Mais promis, je dois reprendre ça, j'ai même commencer sur certaines pages...

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ne faites pas de jointure si vous n'avez pas besoin d'afficher les données en provenance des tables projets ou client.
    Passez par des IN (ou des EXISTS) pour les filtres sur le projet ou le client.

  5. #5
    Invité
    Invité(e)
    Par défaut
    En passant avec un IN ou EXISTS, ça règlera le souci où là, c'est juste une amélioration ?

    Merci

  6. #6
    Membre averti
    Avatar de diablo-dz
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Points : 327
    Points
    327
    Par défaut
    Bonsoir
    essaie avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select table3.nom_client, SUM(total)
    FROM table1
             INNER JOIN table2 ON table1.id=table2.id
             INNER JOIN table3 ON table2.id=table3.id
             WHERE TABLE1.nom_colonne BETWEEN 'AAAA-MM-JJ' AND 'AAAA-MM-JJ' AND
             table3.nom_client='xxxxx';
    A+
    Si une réponse vous a permis d'avancer , n'oublie pas de mettre
    Ne pas oublier

  7. #7
    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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par orygynz Voir le message
    Par contre, 20 ans, c'est pas exagéré ? , mon BTS info ne date que de 2002/2004 et on apprenait comme ça ! .
    La norme SQL qui décrit les jointures avec INNER JOIN... date de 1992 !
    Mais la plupart des enseignants ne sont visiblement toujours pas au courant !
    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

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par ced Voir le message
    La norme SQL qui décrit les jointures avec INNER JOIN... date de 1992 !
    Mais la plupart des enseignants ne sont visiblement toujours pas au courant !
    Saluton, ced,
    Sur quoi se fonde cette quasi généralisation (la plupart des enseignants) ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Sur la proportion de requêtes présentées sur le site, et quelques discussions sur le sujet...
    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
    Invité
    Invité(e)
    Par défaut
    Oups, j'avais oublié ce post, pour info, on m'a aidé pour trouver cette solution :

    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
    SUM(F.total) AS sum_facture
    FROM
        (
          SELECT DISTINCT P.id_client, F.id_facture
            FROM
                PROJETS P
                    INNER JOIN FACTURES F
                        ON F.id_facture = P.id_facture
        INNER JOIN CLIENTS C
                ON P.id_client = C.id_client
                WHERE F.num_facture LIKE ?            
                        AND date_format(F.date_facture, "%m") LIKE ?
                        AND date_format(F.date_facture, "%Y") LIKE ?
                        AND C.nom_client LIKE ?
     
        ) AS FM
            INNER JOIN CLIENTS C
                ON FM.id_client = C.id_client
            INNER JOIN FACTURES F
                ON FM.id_facture = F.id_facture
    Merci à vous !

    Et sinon pour le débat des enseignants, effectivement ils n'étaient peut-être pas à jour mais est-ce que tout le monde l'a utilisé dès le début ???

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

Discussions similaires

  1. Update + SUM + Group BY
    Par laure07 dans le forum Langage SQL
    Réponses: 24
    Dernier message: 21/10/2020, 18h39
  2. Problème de SUM/GROUP BY
    Par ALLODREN dans le forum Langage SQL
    Réponses: 17
    Dernier message: 30/06/2009, 14h09
  3. requete sql jointure + sum() + group by?
    Par bylka dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2008, 12h06
  4. update + sum + group by
    Par PhYx dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/06/2008, 15h44
  5. requete sql deux fois sum groupe by
    Par DIDIDIDA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/03/2008, 13h04

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