按查询中定义的别名分组?

时间:2011-12-30 20:24:03

标签: sql sql-server-2008-r2

为什么我不能按“cnt”分组,必须按count(*)分组。这似乎是多余的,我希望有更好的方法。

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

4 个答案:

答案 0 :(得分:3)

它与SQL查询的逻辑处理顺序有关。具体来说,GROUP BY子句在 SELECT子句之前进行评估,尽管它出现在查询的底部。因此,SELECT中使用的别名在评估查询的逻辑上先前部分时不一定可供查询处理器使用。

同样的原因是你不能在WHERE子句中使用别名:在SELECT之前对该子句进行逻辑处理。另一方面,ORDER BY是要处理的查询的最后一部分 - 通常在那里支持别名(甚至是序列位置)

某些实现可能会选择提供此支持 - 例如,请参阅@daghan发布的MySQL链接 - 但不能依赖它;正如您所见,SQL Server不支持它。

值得指出的是,如果您不顾一切地通过别名引用复杂表达式,您可以将该表达式放在子查询中,并从那里引用它。不过,我会在大多数简单的场景中称之为矫枉过正(例如你问题中的那个)。

更新: @MartinSmith在他对这个问题的评论中提出了一个很好的观点:除了别名,通过聚合表达式进行分组是行不通的。事实上,由于聚合是由一组非聚合列决定的,所以它甚至都没有意义。你实际上试图用这样的查询实现什么?也许我们可以进一步提供帮助。

答案 1 :(得分:1)

除了order by语句中的select子句之外的任何子句,都无法使用列别名。这是因为在评估所有其他子句之后且仅在select之前评估投影列表以及order by中的别名。

答案 2 :(得分:0)

在GROUP BY子句中使用别名可能是ANSI标准的扩展,就像使用序数位置一样,并且每个RDBMS可能都不支持。

答案 3 :(得分:0)