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

 MySQL Discussion :

grouper 2 fois une requete


Sujet :

MySQL

  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut grouper 2 fois une requete
    Bonjour
    Voila mon problème
    Je dois grouper un résultat en fonction de deux critères et cela me pause problème
    Voila ce que j'avais essayé mais ça ne donne pas le bon résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  fam.code_fam2 AS code, fam.desi_lprd AS famille, SUM(ret.cout_rtch) AS couts, m.desc_mois AS mois
    	FROM retouche ret, article art, ligneprd fam, mois m
    	WHERE ret.annee = 2010
    	AND ret.mois = m.mois
    	AND ret.code_arti = art.code_arti
    	AND art.code_lprd = fam.code_lprd
    	GROUP BY 1
    	ORDER BY 1.4;
    J'aimerais obtenir un résultat par mois et par fam2
    Si quelqu'un a une solution, personnellement je pense devoir faire des vues par mois puis les grouper par famille mais il est possible que j'obtienne le même résultat

  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 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
    Bonjour,

    Il y a plusieurs "bizarreries" dans ta requête.
    Tout d'abord, il est préférable d'écrire les jointures selon la norme SQL2, c'est-à-dire avec la syntaxe "INNER JOIN ... ON ...", plutôt que séparer les noms des tables avec des virgules et mettre les conditions de jointures dans la clause WHERE.

    Ensuite, dans la clause GROUP BY, il faut faire figurer tous les champs qui ne sont pas dans le SUM (même si MySQL laisse passer cette syntaxe, nul doute que le résultat obtenu est différent du résultat attendu).

    Enfin, peut-on avoir le schéma des tables et un petit exemple nous permettant de mieux comprendre comment est organisée ta base et ce que tu souhaites obtenir ? Ça nous facilitera la réponse pour pouvoir t'aider.

    ced

    [EDIT] Et dans ORDER BY, il faut séparer les colonnes par une virgule, pas par un point [/EDIT]
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par chabalou Voir le message
    Je dois grouper un résultat en fonction de deux critères
    J'aimerais obtenir un résultat par mois et par fam2
    Si tu souhaites un résultat séparé pa mois et par fam2, il te faut deux requêtes.
    Si tu souhaites un résultat groupé par mois et par famille, il suffit de mettre les deux colonnes dans le GROUP BY. Et comme toutes les colonnes ne faisant pas l'objet d'une fonction d'agrégation doivent figurer dans le GROUP BY, il faut aussi y ajouter la colonne fam.desi_lprd, ce qui ne devrait pas changer le résultat puis celle-ci semble dépendre directement de l'identifiant fam.code_fam2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  fam.code_fam2 AS code, fam.desi_lprd AS famille, 
      SUM(ret.cout_rtch) AS couts, 
      m.desc_mois AS mois
    FROM retouche ret
    INNER JOIN article art ON ret.code_arti = art.code_arti
      INNER JOIN ligneprd fam ON art.code_lprd = fam.code_lprd
    INNER JOIN mois m ON ret.mois = m.mois
    WHERE ret.annee = 2010
    GROUP BY fam.code_fam2, fam.desi_lprd, m.desc_mois
    ORDER BY fam.code_fam2, m.desc_mois
    Au passage :
    - il est temps de se mettre à la syntaxe normalisée depuis 1992 pour les jointures ;
    - préférer nommer les colonnes plutôt que d'utiliser le chiffre de leur position. Si vous changez l'ordre des colonnes, le tri n'est plus le même !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre averti
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    Merci de répondre aussi vite
    j'ai essaye ta solution CinePhil et c'est pas tout à fait ce que je voulais mais ça s'approche

    voila le résultat que je veux obtenir

    code | famille | couts | mois
    a | alpha | 9000.99 | janvier
    b | beta | 9876.54 | janvier
    a | alpha | 542.10 | fevrier
    c | gamma | 43211.10 |fevrier
    b | beta | 4534.4 | mars


    il y a un code_mois pour les mettre dans l'ordre

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Tu veux trier d'abord par mois puis par code/famille ?
    Change l'ordre des colonnes dans le ORDER BY.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre averti
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    J'ai changé ORDER BY, GROUP BY et ça marche.
    Ne me reste plus qu'à récupérer tous les noms de famille à chaque fois, même si ils ne sont pas utilisés dans le mois, je crois que ça se fait avec un LEFT JOIN. Je ne maîtrise pas cette façon de faire des jointures mais je pense que je vais me débrouiller a partir de là

    merci

  7. #7
    Membre averti
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    j'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT fam.code_fam2 AS code, fam.desi_lprd AS famille, SUM( ret.cout_rtch ) AS couts, m.desc_mois AS mois, m.mois
    FROM retouche ret
    INNER JOIN article art ON ret.code_arti = art.code_arti
    LEFT JOIN ligneprd fam ON fam.code_lprd = art.code_lprd
    INNER JOIN mois m ON ret.mois = m.mois
    WHERE ret.annee =2010
    OR art.code_lprd IS NULL 
    GROUP BY fam.code_fam2, fam.desi_lprd, m.desc_mois, m.mois
    ORDER BY m.mois, fam.code_fam2
    mais je n'obtiens pas toutes les "fam2" pour chaque mois

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ne me reste plus qu'à récupérer tous les noms de famille à chaque fois, même si ils ne sont pas utilisés dans le mois, je crois que ça se fait avec un LEFT JOIN.
    Oui

    j'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN ligneprd fam ON fam.code_lprd = art.code_lprd
    mais je n'obtiens pas toutes les "fam2" pour chaque mois
    Normal, c'est la table de gauche qui rendra toutes ses lignes et là fam est du côté droit de la jointure.

    Il faut inverser l'ordre des tables ou utiliser un RIGHT JOIN.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre averti
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    j'ai inverser les champs et ça ne marche pas
    j'ai essayé avec un RIGHT et ça ne marche pas
    J'ai tous retaper depuis le debut avec une logique inverse au niveau des jointure et ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT fam.code_fam2 AS code, fam.desi_lprd AS famille, SUM( ret.cout_rtch ) AS couts, m.desc_mois AS mois, m.mois
    FROM ligneprd fam
    LEFT outer JOIN article art ON fam.code_lprd = art.code_lprd
    LEFT outer JOIN retouche ret ON art.code_arti = ret.code_arti
    INNER JOIN mois m ON ret.mois = m.mois
    WHERE ret.annee =2010
    OR art.code_lprd IS NULL 
    GROUP BY fam.code_fam2,fam.desi_lprd, m.desc_mois, m.mois
    ça ne marche toujours pas

    donc ben je vais essayé avec mon chef pour voir....

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Comme ta condition de restristion (WHERE) porte sur une table qui est à droite de la table principale, si une ligneprd n'a pas de correspondance, elle n'obéira jamais à la restriction et ne sera pas retournée par la requête. Il faut dans ce cas transporter la condition de restriction dans la condition de jointure de la table concernée.
    De plus, il vaut mieux utiliser la jointure externe jusqu'au bout je pense.
    Je pense aussi que le OR est inutile.

    Ca devrait donner ça si mes hypothèses sont exactes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT fam.code_fam2 AS code, 
      fam.desi_lprd AS famille, 
      SUM( ret.cout_rtch ) AS couts, 
      m.desc_mois AS mois, 
      m.mois
    FROM ligneprd fam
    LEFT OUTER JOIN article art ON fam.code_lprd = art.code_lprd
      LEFT OUTER JOIN retouche ret ON art.code_arti = ret.code_arti AND ret.annee = 2010
        LEFT OUTER JOIN mois m ON ret.mois = m.mois
    GROUP BY fam.code_fam2,fam.desi_lprd, m.desc_mois, m.mois
    A essayer. Et si ça ne marche pas, donne des précisions :
    - message d'erreur ?
    - pas le résultat attendu ?
    - pas de résultat ?

    Et donne la description complète des tables (obtenue à l'aide d'une série de SHOW CREATE TABLE la_Table) ainsi qu'un petit jeu de données, éventuellement fictif pour préserver la confidentialité des données.

    Ca nous permettra de tester.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre averti
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    mes "ça ne marche pas" veulent dire que le resultat atendue n'ai pas le bon, desolé j'aurais du preciser
    sinon, ta requete a ne ma rajouter que l'ensemble des familles avec des null pour les champs cout et mois, mais pas comme je les voulais, je test une autre solution puis je repondre a vos demandes
    Et donne la description complète des tables (obtenue à l'aide d'une série de SHOW CREATE TABLE la_Table) ainsi qu'un petit jeu de données, éventuellement fictif pour préserver la confidentialité des données.

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par chabalou Voir le message
    ta requete a ne ma rajouter que l'ensemble des familles avec des null pour les champs cout et mois,
    S'il y a des NULL, c'est qu'il n'y a pas de correspondance dans les tables de droite. C'est un résultat normal en fonction des données présentes.
    Si c'est NULL t'embêtent, cherche du côté de COALESCE pour les éliminer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre averti
    Inscrit en
    Février 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2010
    Messages : 12
    Par défaut
    Mon chef a trouvé une solution en à peu près 25 min, puis il a continué sur sa lancée et a résolu mon problème à 400%, puisqu'il en a résolu d'autres juste avec sa requête en réduisant significativement le php qu'il y avait derrière.
    Voila son chef-d'œuvre
    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
    select x,x2,y,y2,sum(z),sum(z2),sum(z3) from
    (
        select distinct r.mois as x,m.desc_mois as x2, lp.desi_fam1 as y,lp.code_fam1 as y2, sum(0) as z, sum(0) as z2, sum(0) as z3   
        from retouche r
        inner join ligneprd lp 
            inner join mois m on m.mois=r.mois
        where r.annee='2010'
            group by x,x2,y
       union
        select distinct '13' as x,'Cumul' as x2, lp.desi_fam1 as y,lp.code_fam1 as y2, sum(0) as z, sum(0) as z2, sum(0) as z3 
        from retouche r
        inner join ligneprd lp 
        where r.annee='2010'
            group by x,x2,y
       union
        select r.mois as x, m.desc_mois as x2, lp.desi_fam1 as y,lp.code_fam1 as y2, sum(r.cout_rtch) as z, sum(hrs_rtch) as z2, sum(qte_rtch) as z3
        from retouche r
        inner join article a on a.code_arti=r.code_arti
        inner join ligneprd lp on lp.code_lprd=a.code_lprd
            inner join mois m on m.mois=r.mois
        where r.annee='2010'
            group by x,x2,y
       union
        select '13' as x, 'Cumul' as x2, lp.desi_fam1 as y,lp.code_fam1 as y2, sum(r.cout_rtch) as z, sum(hrs_rtch) as z2, sum(qte_rtch) as z3
        from retouche r
        inner join article a on a.code_arti=r.code_arti
        inner join ligneprd lp on lp.code_lprd=a.code_lprd
               where r.annee='2010'
            group by y
    ) t
    group by x,x2,y
    order by abs(x)desc,x2,y,y2
    et ça en a peine une heure alors que ça fait un jour et demi que je suis dessus, j'ai encore du chemin a faire. En tous cas je voulait quand même remercier CinePhil et ced de m'avoir aidé

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

Discussions similaires

  1. [MySQL] Utilisation des valeur choix multiple pour executer une requete une valeur a la fois
    Par guigui69 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/12/2007, 17h43
  2. Réponses: 2
    Dernier message: 22/06/2006, 14h59
  3. Réponses: 2
    Dernier message: 14/06/2006, 09h53
  4. Réponses: 2
    Dernier message: 22/05/2006, 15h08
  5. Réponses: 5
    Dernier message: 14/04/2006, 19h58

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