Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL génère-t-elle une erreur « Pas une fonction de groupe à groupe unique » ?

Pourquoi ma requête SQL génère-t-elle une erreur « Pas une fonction de groupe à groupe unique » ?

DDD
DDDoriginal
2024-12-23 16:30:17797parcourir

Why Does My SQL Query Produce a

Comprendre l'erreur « Pas une fonction de groupe à groupe unique » dans SQL

En SQL, une fonction de groupe à groupe unique, telle que MAX(), SUM() ou AVG() est appliqué à un groupe de lignes ayant les mêmes valeurs dans les colonnes de regroupement spécifiées. Cependant, si vous essayez d'inclure des expressions de colonne individuelles dans la liste SELECT avec une fonction de groupe et que vous n'incluez pas toutes ces expressions dans la clause GROUP BY, vous rencontrerez l'erreur « pas une fonction de groupe à groupe unique ».

Explication du problème

Dans l'exemple d'instruction SQL que vous avez fourni :

SELECT SSN, MAX(SUM(TIME))
FROM downloads
GROUP BY SSN

la requête tente de calculer le maximum valeur de la somme de TIME pour chaque SSN unique, puis renvoie le SSN associé à cette valeur maximale. Cependant, cette requête présente un problème fondamental :

  • L'expression MAX(SUM(TIME)) est une fonction de groupe à groupe unique qui calcule la somme maximale de TIME pour chaque SSN. Par définition, cela signifie qu'il n'y a qu'un seul résultat pour chaque SSN.
  • L'inclusion de l'expression de colonne individuelle SSN dans la liste SELECT viole la règle selon laquelle toutes les expressions de colonne individuelles incluses dans la liste SELECT doivent également être incluses dans le Clause GROUP BY.

Résolution

Pour résoudre cette erreur, vous disposez de trois options :

  • Supprimez l'expression de colonne individuelle (SSN) de la liste SELECT : Cela vous donnera la somme maximale de TIME sans le SSN associé.
  • Ajoutez l'expression de colonne individuelle (SSN) à la clause GROUP BY : Cela regroupera les résultats par SSN et TIME, vous permettant de récupérer le SSN associé avec la somme maximale de TIME.
  • Utilisez une sous-requête : Vous pouvez utiliser une sous-requête pour récupérer la somme maximale de TIME, puis utiliser cette valeur dans une requête distincte pour identifier le SSN associé.

Exemple de requête utilisant l'option 2

SELECT SSN, MAX(SUM(TIME))
FROM downloads
GROUP BY SSN, TIME

Cette requête regroupera les résultats par SSN et TIME, vous permettant de récupérer le SSN associé à la somme maximale de TIME pour chaque SSN.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn