Mysql
 sql >> Base de données >  >> RDS >> Mysql

La requête avec GROUP BY et ORDER BY ne fonctionne pas lorsque plusieurs colonnes dans SELECT sont choisies

Vous devez être prudent lorsque vous utilisez GROUP BY . Une fois que vous avez compris ce que GROUP BY fait, vous connaîtrez le problème vous-même. Il fait une agrégation sur vos données ou en d'autres termes, il réduit vos données en effectuant une opération sur les entrées brutes et en créant un nouveau nombre réduit d'entrées sur lesquelles une fonction d'agrégation a été appliquée (SUM, COUNT, AVG, etc.)

Les champs que vous fournissez dans le GROUP BY La clause représente le niveau d'agrégation/de cumul que vous recherchez.

SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

Ici, vous essayez de faire l'agrégation à col1 niveau, ce qui signifie que pour chaque valeur distincte présente dans la colonne col1 , une opération sera effectuée sur d'autres colonnes que vous fournissez dans SELECT clause(ici col2 ,col3 ) de sorte que dans la sortie, vous ayez des valeurs non répétitives dans col1 et quelques valeurs cumulées de col2 et col3 contre chaque col1 distinct valeur basée sur la fonction que vous appliquez (SUM, COUNT, AVG, etc.).

Comment appliquer cette fonction ? C'est ce qui manque dans votre requête ci-dessus. Pour le résoudre, vous devez appliquer une fonction d'agrégation sur les champs présents dans le SELECT clause mais pas dans GROUP BY clause. En prenant un exemple de SUM, essayez ceci :

SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1

OU pour une meilleure idée, en supprimant WHERE filter et vérifier la sortie en exécutant :

SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1

De plus, la raison pour laquelle votre autre requête

SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2

travaillé est parce que vous n'avez pas besoin d'appliquer l'agrégation au champ (ici col2 ) qui est présent dans le GROUP BY clause.