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

Sql 是否按查询中定义的别名分组?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,为什么我不能按“cnt”分组,而必须按计数(*)分组。这似乎是多余的,我希望有更好的方法 SELECT count(*) as cnt from table group by count(*) 在GROUPBY子句中使用别名可能是ANSI标准的扩展,就像使用序号位置一样,并且可能不是每个RDBMS都支持 在GROUP BY子句中使用别名可能是ANSI标准的扩展,就像使用序号位置一样,并且可能不是每个RDBMS都支持别名 以上可能是您需要的 上面可能是您需要的它与SQL查询的逻辑处理顺序有关。

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

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

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

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

以上可能是您需要的


上面可能是您需要的

它与SQL查询的逻辑处理顺序有关。具体来说,GROUPBY子句在SELECT子句之前求值,尽管它出现在查询的底部。因此,SELECT中使用的别名在查询处理器计算查询的逻辑上优先的部分时不一定对查询处理器可用

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

一些实现可能会选择提供这种支持——例如,请参阅@daghan发布的MySQL链接——但这是不可靠的;正如您所看到的,SQL Server不支持它

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


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

这与SQL查询的逻辑处理顺序有关。具体来说,GROUPBY子句在SELECT子句之前求值,尽管它出现在查询的底部。因此,SELECT中使用的别名在查询处理器计算查询的逻辑上优先的部分时不一定对查询处理器可用

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

一些实现可能会选择提供这种支持——例如,请参阅@daghan发布的MySQL链接——但这是不可靠的;正如您所看到的,SQL Server不支持它

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


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

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

之前计算的。除了
select
语句中的
order by
子句之外,您无法在任何子句中使用列别名。这是因为投影列表以及
select
中的别名是在计算所有其他子句之后,并且仅在
order by
之前计算的。这句话是不正确的:“不能在用于group by子句的group by列表的表达式中使用聚合或子查询。”。我不理解这个问题。我不投反对票。但是,你能解释一下吗?是的。您不能
按计数分组(*)
,这毫无意义。这句话不正确:“不能在用于group by子句的group by列表的表达式中使用聚合或子查询。”。我不理解这个问题。我不投反对票。但是,你能解释一下吗?是的。您不能按计数(*)分组。这毫无意义。相关连接项:相关连接项: