2011-12-30 3 views
1

Почему я не могу группировать «cnt» и вам приходится группировать по счету (*). Это кажется излишним, и я хочу, чтобы был лучший способ.Группировка по псевдониму, определенному в запросе?

SELECT count(*) as cnt 
from table 
group by count(*) 
+1

Это предложение неверно: «Нельзя использовать агрегат или подзапрос в выражении, используемом для группы по списку предложения GROUP BY.». Я не понимаю вопроса. Я не проголосую за него. Но, можете ли вы объяснить? – danihp

+1

Да. Вы не можете группировать по счету (*) ', что не имеет смысла. –

ответ

3

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

По той же причине вы не можете использовать псевдонимы в предложении WHERE: это предложение логически обработано перед SELECT. ORDER BY, с другой стороны, является последней частью обрабатываемого запроса - псевдонимы (или даже порядковые позиции столбцов) -, которые обычно поддерживаются там.

Некоторые варианты реализации могут предоставить эту поддержку - см., Например, ссылку на MySQL, которую @daghan отправил, но на нее нельзя положиться; SQL Server, как вы можете видеть, не поддерживает его.

Стоит отметить, что если бы вы отчаянно ссылались на сложное выражение псевдонимом, вы могли бы поместить это выражение в подзапрос и ссылаться на него оттуда. Я бы назвал это излишеством в самых простых сценариях (например, в вашем вопросе).

Обновление: @MartinSmith поднимает хороший момент в своем комментарии к вопросу: сглаживание в сторону, группировка по агрегированному выражению не сработает. Фактически, поскольку совокупность определяется группировкой неагрегатных столбцов, это даже не имеет смысла. Что вы на самом деле пытаетесь достичь с помощью такого запроса? Возможно, мы можем помочь дальше.

+0

Связанный элемент подключения: [Использование псевдонима столбцов в любом месте в запросе] (http://connect.microsoft.com/SQLServer/feedback/details/610120) –

0

Использование псевдонима в GROUP BY предложения может быть расширением стандарта ANSI так же, как с помощью порядковой позиции и может не поддерживаться каждым RDBMS.

1

Невозможно использовать псевдоним столбца в любом предложении, отличном от предложения order by, в операторе select. Это связано с тем, что список прогнозов и, следовательно, сглаживание в select оцениваются после оценки всех остальных предложений и только до order by.

Смежные вопросы