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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 063
    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 063
    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

+ 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, 16h43
  2. Réponses: 2
    Dernier message: 22/06/2006, 13h59
  3. Réponses: 2
    Dernier message: 14/06/2006, 08h53
  4. Réponses: 2
    Dernier message: 22/05/2006, 14h08
  5. Réponses: 5
    Dernier message: 14/04/2006, 18h58

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