Почему я не могу GROUP BY 1, когда это Можно заказать 1?

Почему порядковые номера столбцов допустимы для ORDER BY , но не для GROUP BY ? То есть, может ли кто-нибудь сказать мне, почему этот запрос

SELECT OrgUnitID, COUNT(*) FROM Employee AS e GROUP BY OrgUnitID

не может быть записан как

SELECT OrgUnitID, COUNT(*) FROM Employee AS e GROUP BY 1

Когда совершенно законно написать запрос наподобие

SELECT OrgUnitID FROM Employee AS e ORDER BY 1

?

Мне действительно интересно, есть ли что-то тонкое в реляционном исчислении, или что-то такое, что помешало бы правильной работе группировки.

Дело в том, что мой пример довольно тривиален. Обычно столбец, по которому я хочу сгруппировать, на самом деле является вычислением, и необходимость повторения точно такого же вычисления в GROUP BY является (a) раздражающей и (b) делает ошибки во время обслуживания намного более вероятными. Вот простой пример:

SELECT DATEPART(YEAR,LastSeenOn), COUNT(*)
    FROM Employee AS e
    GROUP BY DATEPART(YEAR,LastSeenOn)

Я думаю, что правило нормализации SQL для представления данных только один раз в базе данных должно распространяться и на код. Я хотел бы исправить это выражение только один раз (в списке столбцов SELECT ) и иметь возможность ссылаться на него по порядковому номеру в GROUP BY .

Пояснение: Я специально работаю над SQL Server 2008, но все же задаюсь вопросом об общем ответе.

13
задан Chris Wuestefeld 2 September 2010 в 20:38
поделиться