web-dev-qa-db-fra.com

Est-il possible d'utiliser la fonction d'agrégation dans une instruction Select sans utiliser la clause Group By?

Jusqu'à présent, j'ai écrit la fonction Aggregate suivie de la clause Group By pour trouver les valeurs basées sur SUM, AVG et d'autres fonctions Aggregate. J'ai un peu de confusion dans la clause Group By. Lorsque nous utilisons Aggregate fonctions quelles sont les colonnes que je dois spécifier dans la clause Group By. Sinon Existe-t-il un moyen d'utiliser les fonctions d'agrégation sans utiliser la clause Group By.

17
thevan

Toutes les colonnes de la clause SELECT qui n'ont pas d'agrégat doivent être dans le GROUP BY

Bien:

SELECT col1, col2, col3, MAX(col4)
...
GROUP BY col1, col2, col3

Bien aussi:

SELECT col1, col2, col3, MAX(col4)
...
GROUP BY col1, col2, col3, col5, col6

Pas d'autres colonnes = pas de GROUP BY nécessaire

SELECT MAX(col4)
...

Ne fonctionnera pas:

SELECT col1, col2, col3, MAX(col4)
...
GROUP BY col1, col2

Inutile:

SELECT col1, col2, col3, MAX(col4)
...
GROUP BY col1, col2, col3, MAX(col4)

Avoir un agrégat (MAX, etc.) avec d'autres colonnes sans GROUP BY n'a aucun sens car la requête devient ambiguë.

30
gbn

Vous pouvez utiliser Select AGG () OVER () dans TSQL

SELECT *,
SUM(Value) OVER()
FROM Table

Il existe d'autres options pour Over comme Partition By si vous souhaitez regrouper:

SELECT *,
SUM(Value) OVER(PARTITION By ParentId)
FROM Table

http://msdn.Microsoft.com/en-us/library/ms189461.aspx

23
Anthony Sottile

Oui, vous pouvez utiliser un agrégat sans GROUP BY:

SELECT SUM(col) FROM tbl;

Cela retournera une seule ligne - la somme de la colonne "col" pour toutes les lignes de tbl (à l'exclusion des valeurs nulles).

6
nvogel

Vous devez regrouper par colonnes qui ont pas des fonctions d'agrégation.

Vous pouvez éviter une clause group by si les colonnes all sélectionnées ont des fonctions d'agrégation appliquées.

2
Bohemian

Les colonnes qui ne sont pas présentes dans la fonction d'agrégation doivent apparaître sur la clause group by:

Select 
Min(col1), 
Avg(col2), 
sum(col3) 
from table

alors nous n'avons pas besoin de la clause group by, mais s'il y a une colonne qui n'est pas présente dans la fonction Aggregate, vous devez utiliser group by pour cette colonne.

Select 
col1, 
col2, 
sum(col3) 
from  table 
group by col1,col2

alors nous devons utiliser le groupe par pour la colonne col1 et col2

1
Bhawesh Deepak

Vous omettez les colonnes de SELECT dans les fonctions d'agrégation, toutes les autres colonnes doivent exister dans la clause GROUP BY séparée par une virgule.

Vous pouvez avoir une requête avec des agrégats et aucun regroupement, tant que vous n'avez que des valeurs d'agrégation dans l'instruction SELECT

1
niktrs