Règle d'agrégation

ygj Messages postés 78 Statut Membre -  
jordane45 Messages postés 40050 Statut Modérateur -
Bonjour,
si quelqu'un m'explique cette règle d'agrégation :
Dans le SELECT, on ne peut faire appel à une fonction d’agrégation uniquement si toutes les autres colonnes :
résultent elles aussi d’une fonction d’agrégation,
OU
sont présentes dans la clause GROUP BY.


si c'est possible, des exemple pour l'explication.
merci d'avance.


Configuration: Windows / Firefox 77.0

2 réponses

Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

Pour faire très très simple.
Imagine la table suivante :

table Fruits
Type - Poids
Pomme - 100g
Pomme - 120g
Orange - 130g
Poire - 100g

Si tu demandes
SELECT avg(Poids) from fruits;
Tu auras la moyenne de tous les poids.

Si tu veux la moyenne des poids par fruit, tu fais :
SELECT avg(Poids) from fruits group by type;
et pour voir le type correspondant, il est plus clair de faire
SELECT type, avg(Poids) from fruits group by type;

Maintenant, imagine la requête suivante :
SELECT type, avg(Poids) from fruits;
et mets-toi à la place du moteur SQL : quel est ce "type" qu'on veut afficher ? La requête renvoie juste une valeur, la moyenne de l'ensemble, puisqu'on n'a pas de GROUP BY.
On comprend bien que quelque chose ne va pas.

Et bien c'est de ça que parle la phrase que tu cites.
Quand on utilise une fonction d'aggrégation (AVG, ici), toutes les colonnes que l'on demande DOIVENT faire partie de champs du GROUP BY (ou être elles-mêmes des fonctions d'agrégation, par exemple on pourrait imaginer de rajouter SUM(poids), MIN(poids), etc)

Xavier
1
jordane45 Messages postés 40050 Statut Modérateur 4 758
 
Bonjour,

Et dans le cas où on ne voudrait pas avoir à renseigner dans le select des champs qui ne sont pas dans le group by, il suffit de modifier l'option SQL_MODE et y retirant le ONLY_FULL_GROUP_BY

en ligne de commande
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));


Ou via phpmyadmin



PS: Pour rappel, lorsque l'on poste du code sur le forum ( même si ce n'est qu'une petite requête SQL..) merci d'utiliser les balises de code.
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0