SQL Server中嵌套查询使用别名做Group By为何无法生效
嵌套SQL写法无法正常运行的原因
第一种写法无法生效是两处问题共同导致的:
- 核心语法错误:内层子查询缺失必填的
GROUP BY子句。当SELECT语句中同时返回非聚合的计算值(本例中是DATEPART(YEAR, [starttime])提取的年份值)和聚合函数结果(本例中是COUNT(*)统计的骑行量)时,数据库要求必须把所有非聚合的字段/计算值放到GROUP BY后明确聚合维度,否则引擎无法判断按什么粒度拆分数据做计数,内层子查询本身就不符合SQL语法规则,无法正常执行,外层查询自然拿不到结果。 - 冗余逻辑错误:外层查询存在无意义的重复分组。就算给内层补全了正确的分组逻辑,内层输出的已经是「每个年份对应唯一骑行量」的聚合结果,外层再对
x.Year和x.Number_of_rides做分组属于完全多余的操作,不会改变查询结果,还会额外增加执行开销。
你写的第二种可正常运行的写法,本质是直接在原表层面声明了按年份分组的聚合规则,完全符合SQL聚合查询的语法要求,所以可以正常返回结果。
如果一定要用嵌套结构实现相同需求,正确写法如下:
SELECT Year, Number_of_rides FROM (SELECT DATEPART(YEAR, [starttime]) AS Year, COUNT (*) AS Number_of_rides FROM [dbo].[Citi-Bike-Trip-Data] GROUP BY DATEPART(YEAR, [starttime]) -- 补全内层缺失的分组逻辑 ) AS x ORDER BY Year ASC -- 外层无需重复分组,直接读取子查询结果排序即可
内容的提问来源于stack exchange,提问作者Ameyaw Ahmed Sadat
相关产品推荐
相关产品推荐

