0
votes

GROUP BY ne fonctionne pas lorsque j'exécute ce qui suit: SELECT jobtitle, salaire, COUNT (*) FROM employés GROUP BY salaire;

Après avoir créé une base de données de test et des tables pour les requêtes SQL, je vois que dans un tutoriel, ce qui suit devrait afficher des tables, mais une fois exécuté, j'obtiens une erreur:

SELECT jobtitle, salary, COUNT(*) FROM employees GROUP BY salary;

ERREUR 1055 (42000): L'expression n ° 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient une colonne non agrégée «company.employees.name» qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY; ceci est incompatible avec sql_mode = only_full_group_by

Ce n'est pas le cas lorsque je supprime le titre du poste

Pourquoi le titre du travail n'est-il pas une expression valide pour group by lors de l'exécution de ma requête?


2 commentaires

Les clés du GROUP BY doivent correspondre aux colonnes non agrégées du SELECT .


S'il existe vraiment un didacticiel qui n'inclut pas dans le GROUP BY toutes les colonnes non agrégées du SELECT, il est peut-être temps de trouver un meilleur didacticiel


3 Réponses :


1
votes

Une chose importante à prendre en compte lors de l'écriture de la clause GROUPBY dans les requêtes est que:

  1. Seuls les attributs qui apparaissent dans GROUPBY peuvent être utilisés avec le mot clé SELECT.
  2. Fonctions d'agrégation telles que count, min, max, avg , etc. peut être utilisé après le mot clé SELECT.

Ainsi, la requête correcte sera,

SÉLECTIONNER le titre du poste, le salaire, COUNT (*) FROM employés GROUP BY salaire, le titre du poste;


2 commentaires

Je pense que le point 1 est mal défini ci-dessus, au point d'être trompeur


Merci pour la réponse. J'ai utilisé la requête que vous avez fournie car elle était la même que le commentaire ci-dessus.



2
votes

Historiquement, mysql, contrairement à la plupart des autres serveurs sql, autorisait la sélection de champs arbitraires lors de l'utilisation de group by. Dans votre exemple, le titre du travail serait renvoyé à partir d'une ligne arbitraire des employés pour le salaire retourné. Il n'y a aucune garantie que ce serait même le même pour un salaire donné entre deux exécutions de la requête.

Comme il s'agit d'une source courante de bogues, mysql s'est éloigné de l'autoriser, permettant d'abord d'accepter une validation plus stricte, puis d'en faire la valeur par défaut. Ceci est contrôlé par la variable système SQL_MODE. Vous pouvez revenir à l'ancienne, mauvaise manière en faisant set session sql_mode=replace(@@sql_mode,'ONLY_FULL_GROUP_BY',''); avant votre requête.

Mais il vaut mieux suivre des règles plus strictes. Vous pouvez indiquer explicitement à votre requête comment trouver un titre de poste non arbitraire pour chaque salaire, comme:

SELECT jobtitle, salary, COUNT(*) FROM employees GROUP BY salary, jobtitle;

ou

SELECT MAX(jobtitle) AS jobtitle, salary, COUNT(*) FROM employees GROUP BY salary;

ou vous pouvez simplement regrouper par les deux, renvoyant potentiellement plusieurs lignes pour un salaire donné lorsqu'il y a plus d'un titre de poste pour ce salaire:

SELECT MIN(jobtitle) AS jobtitle, salary, COUNT(*) FROM employees GROUP BY salary;


1 commentaires

Merci pour tous les détails et les exemples de requêtes SQL. J'ai pris le dernier et l'ai essayé et ça marche. Je ne suis pas entré dans le min et le max dans mes études mais c'est utile pour mes notes que je prends sur github



0
votes

Votre clause group by doit contenir tous les attributs que vous ajoutez dans l'instruction select avec la fonction d'agrégation.

Votre requête devrait donc être

SELECT jobtitle, salary, COUNT(*) FROM employees GROUP BY salary,jobtitle;


0 commentaires