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 :

utilisation de GROUP BY


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 12
    Points
    12
    Par défaut utilisation de GROUP BY
    Bonjour à tout le mode!

    J'ai petite base de données consistante les deux tables suivantes:

    1=> table employe contient:

    Id nom emploi date_entree salaire id_dept

    1 jean enseaigant 2003-02-12 3000 10

    2 Joseph directeur 2001-12-25 4000 10

    3 Martin prof-adj 2012-08-10 2500 20

    5 Alain directeur 2005-02-15 4500 30

    6 Alpani enseigant 2008-02-15 3200 20

    7 Julie enseigante 2009-05-01 3000 20

    8 Martine prof-adj 2012-01-29 4000 40

    2=> table dept (departement)

    Id NomD Localité

    10 science Paris
    20 Maths Bordeau


    Ma question à répondre est : Afficher les noms des employés des départements ayant plus que 2 employés.

    Pour cela j’ai pensé qu’il faut regrouper d’abord les employés selon leurs départements pour savoir quels sont les départements ayant plus 2 employés. Donc, voici ma logique suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, COUNT(*)  nb_employé 
    FROM employe  
    GROUP BY id_dept  
    HAVING COUNT(*)>=2;
    Cette requête m'affiche:

    Nom nb_employé
    Jean 2
    Martin 3

    Jean et Martin ce sont les premiers enregistrements dans la table pour chaque departement.
    Mon objectif c’est afficher tous les noms qui sont du même département et non le premier enregistrement pour chaque departement comme ma requete fait.

    Alors est-ce quelqu’un peut m’aider à trouver les noms des employes qui sont du même departement où le nombre des employés >= 2.

    Merci pour votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id_dept FROM employe GROUP BY id_dept HAVING COUNT(*)>=2;
    Tu vas avoir la liste des départements qui ont au moins 2 employés.

    Apres, tu as juste à faire une jointure sur id_dept.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta reponce, mais je n'ai pas bien compris comment je dois faire une jointure sur id_dept?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT dept.id ,employe.id_dept 
    FROM employe,dept 
    where dept.id=employe.ide_dept 
    GROUP BY employe.id_dept 
    HAVING COUNT(*)>=2
    Ca me donne un resultat qui n'a rien avoir avec ce que je cherche qui un resultat de 2 colonnes contenant de meme chose. alors je veux afficher tous les noms des employés de departements retenus dans la requte.

    Merci a l'avance.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT d.NomD, d.Localite,
    	e.nom
    FROM employe e
    INNER JOIN
    (
    	SELECT id_dept 
    	FROM employe 
    	GROUP BY id_dept 
    	HAVING COUNT(*) >= 2
    ) tmp ON tmp.id_dept = e.id_dept
    	INNER JOIN dept d ON d.Id = tmp.id_dept
    ORDER BY d.NomD, d.Localite, e.nom

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par adenoula Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, COUNT(*)  nb_employé 
    FROM employe  
    GROUP BY id_dept  
    HAVING COUNT(*)>=2;
    Cette requête m'affiche:
    ...
    Jamais cette requête n'aurait du produire un quelconque résultat et aurait dû émettre un message d'erreur car elle est totalement incohérente !

    Voici ce qu'une telle requête donne sur MS SQL Server :

    Msg*8120, Niveau*16, État*1, Ligne*1
    La colonne 'employe.nom' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.


    Voici ce qu'elle donne sur PostGreSQL :

    ERREUR: la colonne « employe.nom » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
    LINE 1: SELECT nom, COUNT(*) AS nb_employé
    ^
    ********** Erreur **********
    État SQL :42803
    Caractère : 8


    Même topo sous Oracle !

    Bref, encore un des nombreux bug de cet ersatz de SGBDR qu'est MySQL !!!
    A lire sur le sujet : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

    A +

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Jamais cette requête n'aurait du produire un quelconque résultat et aurait dû émettre un message d'erreur car elle est totalement incohérente !

    Voici ce qu'une telle requête donne sur MS SQL Server :

    Msg*8120, Niveau*16, État*1, Ligne*1
    La colonne 'employe.nom' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.


    Voici ce qu'elle donne sur PostGreSQL :

    ERREUR: la colonne « employe.nom » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
    LINE 1: SELECT nom, COUNT(*) AS nb_employé
    ^
    ********** Erreur **********
    État SQL :42803
    Caractère : 8


    Même topo sous Oracle !

    Bref, encore un des nombreux bug de cet ersatz de SGBDR qu'est MySQL !!!
    A lire sur le sujet : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

    A +
    Ce n'est pas parce que ça ne fonctionne pas comme tu le souhaites que c'est un bug !

    Si tu tiens tellement à ce contrôle, il suffit d'ajouter le mode "ONLY_FULL_GROUP_BY"

    Et MYSQL te sortiras le même genre d'erreur que les autres SGBD:
    Error Code: 1055. 'employe.nom' isn't in GROUP BY

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Ce n'est pas parce que ça ne fonctionne pas comme tu le souhaites que c'est un bug !
    C'est au moins un comportement de MySQL très discutable puisqu'il peut produire des erreurs ou des résultats mal interprétés par un utilisateur inattentif !

    Si tu tiens tellement à ce contrôle, il suffit d'ajouter le mode "ONLY_FULL_GROUP_BY"

    Et MYSQL te sortiras le même genre d'erreur que les autres SGBD:
    Error Code: 1055. 'employe.nom' isn't in GROUP BY
    Je ne connaissais pas ! Ça devrait être le mode par défaut !

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Ce n'est pas parce que ça ne fonctionne pas comme tu le souhaites que c'est un bug !

    Si tu tiens tellement à ce contrôle, il suffit d'ajouter le mode "ONLY_FULL_GROUP_BY"

    Et MYSQL te sortiras le même genre d'erreur que les autres SGBD:
    Error Code: 1055. 'employe.nom' isn't in GROUP BY
    Sauf que le résultat n'a aucun sens !
    Dans tous les cas MySQL aurait du ne sortir aucune ligne car il n'y a aucun couple nom/departement plus d'une fois.

    Comme dit ici : http://blog.developpez.com/sqlpro/p9...x-yeux/#c42717
    On se demande pourquoi il est allé cherché andré et pas louis ou jules et jean au lieu de marc, line ou paul !!!
    Mais comment faire autrement ? En effet, cette requête est illégale dans le langage SQL.... On ne peut pas avoir simultanément un agrégat et le détail... il faut choisir ou bien utiliser une fonction de fenêtrage qui rend indépendant le calcul de l'agrégat (mais ces fonctions de fenêtrage présentes dans le langage SQL depuis la version de 1999, ne sont toujours pas implémentées dans mySQL !)



    A +

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    C'est au moins un comportement de MySQL très discutable puisqu'il peut produire des erreurs ou des résultats mal interprétés par un utilisateur inattentif !


    Je ne connaissais pas ! Ça devrait être le mode par défaut !
    Apparemment, ça existe depuis la 4.0 ( sortie en 2000)

    Si en 12 ans, ils n'ont pas décidé de mettre ce contrôle par défaut,c'est qu'il y a surement une raison autre que de la compatibilité. Enfin j'espère...

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Apparemment, ça existe depuis la 4.0 ( sortie en 2000)

    Si en 12 ans, ils n'ont pas décidé de mettre ce contrôle par défaut,c'est qu'il y a surement une raison autre que de la compatibilité. Enfin j'espère...
    Malheureusement, je pensais justement, après avoir posté mon précédent message, que la raison est justement qu'il y a trop de requêtes ainsi mal foutues dans les développements qui tournent de par le monde et qu'ils ne veulent pas s'attirer les foudres de ceux qui changent de version de MySQL, par volonté ou par force (hébergeur) et qui verraient leur beau programme planter sans savoir pourquoi !

    La compatibilité ascendante, ça a du bon mais aussi des travers !

    Tiens ! c'est un peu comme la syntaxe des jointures ça...

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Il y a un article qui traite du sujet ici :
    http://cedric-duprez.developpez.com/...r-group-by/#L6

    J'ai la tête qui tourne avec ces histoires de normes...

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Cet article est relativement incomplet... Cette possibilité fait partie du niveau avancé de la norme SQL qui propose 3 niveaux :
    • ENTRY
    • INTERMEDIATE
    • FULL

    C'est dans cette dernière catégorie que se place la possibilité de définir partiellement le GROUP BY

    Cepandant, et plus important, la phrase :
    il faut que toute colonne non agrégée qui apparaît dans la liste du SELECT soit fonctionnellement dépendante de la clause GROUP BY.

    Or la colonne "nom" n'est pas fonctionnellement dépendante de la colonne "id_dept", c'est exactement l'inverse !!!

    D’où ce qualificatif de bug (il faut appeler un chat un CHAT).

    A +

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT d.NomD, d.Localite,
    	e.nom
    FROM employe e
    INNER JOIN
    (
    	SELECT id_dept 
    	FROM employe 
    	GROUP BY id_dept 
    	HAVING COUNT(*) >= 2
    ) tmp ON tmp.id_dept = e.id_dept
    	INNER JOIN dept d ON d.Id = tmp.id_dept
    ORDER BY d.NomD, d.Localite, e.nom

    Merci à tous ceux et celles qui ont participer pour me depanner et merci particulierent a CinePhil car sa proposition m'a aider à resoudre ce mon probleme.

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

Discussions similaires

  1. Utilisation du group by
    Par CoeurDeSQL dans le forum SQL
    Réponses: 7
    Dernier message: 15/04/2008, 14h06
  2. Réponses: 5
    Dernier message: 11/04/2007, 13h02
  3. [MySQL 5.0] RAND() inefficace quand utilisation de GROUP BY
    Par Takusen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/11/2006, 15h39
  4. [XSD] Utilisation de groupes de balises xhtml
    Par Kehel dans le forum Valider
    Réponses: 7
    Dernier message: 30/01/2004, 09h55

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