Non, tu as le droit de faire un group by sur un champ non sélectionné (à vérifier tout de même).
Mais par contre, le GORUP BY doit porter sur TOUTES les colonnes calculées SAUF celles qui sont résultent d'une fonction de regroupement.
Ainsi, par exemple :
Code :
SELECT count(*) cpt, abs(qte) absqte, sum(prix), nom FROM trucmuche GROUP BY abs(qte), nom
|
Ce qui est parfaitement normal.
Voici ce que dit la doc de SQL Server 2005 sur le sujet (soit rigoureusement la même chose qu'Oracle) :
http://msdn2.microsoft.com/fr-fr/library/ms177673.aspx
Citation :
Spécifie les groupes sur lesquels positionner les lignes de sortie. Si les fonctions d'agrégation sont comprises dans la clause SELECT <select list>, GROUP BY calcule une valeur de résumé pour chaque groupe. Lorsque GROUP BY est spécifiée, vous devez inclure dans la liste GROUP BY chaque colonne de toute expression de non-agrégation figurant dans la liste de sélection, ou l'expression GROUP BY doit correspondre exactement à l'expression figurant dans la liste de sélection.
|
Les exemples ensuite parlent d'eux-même.
Ici, un topo sur la norme SQL. On découvre que GROUP BY a été introduit avec la version 2 de la norme "SQL 2".
http://sql.developpez.com/sqlaz/ensembles/#L1
Citation :
NOTA :
La présence de la clause GROUP BY est nécessaire dès que la clause de sélection, ou le filtre WHERE, ou encore les jointures comportent simultanément des calculs d'agrégation et la présence de colonnes de table hors de calculs d'agrégation. De plus, outes les colonnes représentées hors des calculs d'agrégation doivent figurer dans la clause GROUP BY.
|
(c'est un peu chiant, c'est bourré de fautes de frappes mais bon