Можно ли использовать функцию агрегирования в выборе Select без использования предложения Group By? - PullRequest
13 голосов
/ 24 июня 2011

Пока что я написал функцию Aggregate, за которой следует предложение Group By, чтобы найти значения, основанные на SUM, AVG и других функциях Aggregate.Я немного запутался в предложении Group By.Когда мы используем функции Aggregate, какие столбцы мне нужно указать в предложении Group By.Иначе, есть ли способ использовать агрегатные функции без предложения Group By.

Ответы [ 6 ]

24 голосов
/ 24 июня 2011

Все столбцы в предложении SELECT, у которых нет агрегата, должны быть в GROUP BY

Хорошо:

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

Также хорошо:

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

Нет других столбцов = не требуется GROUP BY

SELECT MAX(col4)
...

Не будет работать:

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

Бессмысленно:

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

Наличие агрегата (MAX и т. Д.) С другими столбцами без GROUP BY не имеет смысла, поскольку запрос становится неоднозначным.

21 голосов
/ 24 июня 2011

Вы можете использовать Select AGG () OVER () в TSQL

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

Есть и другие опции для Over, например Partition By, если вы хотите сгруппировать:

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

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

4 голосов
/ 24 июня 2011

Да, вы можете использовать агрегат без GROUP BY:

SELECT SUM(col) FROM tbl;

Это вернет только одну строку - сумму столбца "col" для всех строк в таблице (кроме нулей).

2 голосов
/ 24 июня 2011

Вы должны группировать по столбцам, у которых , а не , есть агрегирующие функции.

Вы можете избежать предложения группировки по, если все выбранные столбцы имеют агрегированные функции..

1 голос
/ 24 июня 2016

Столбцы, которых нет в функции Aggregate, должны входить в группу по выражению:

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

тогда нам не требуется группировать по предложению, но если есть какой-то столбец, которого нет в функции Aggregate, тогда вы должны использовать group by для этого столбца.

Select 
col1, 
col2, 
sum(col3) 
from  table 

группировка по col1, col2

тогда мы должны использовать group by для столбцов col1 и col2

1 голос
/ 24 июня 2011

Вы опускаете столбцы из SELECT внутри агрегатных функций, все остальные столбцы должны существовать в предложении GROUP BY, разделенном запятой.

Вы можете иметь запрос с агрегатами и без группировки, если у вас есть ТОЛЬКО агрегатзначения в операторе SELECT

...