使用 HAVING 时出现“无效的列名称”

问题描述 投票:0回答:4

我正在使用 Microsoft SQL Server 2014。

以下是我的询问

SELECT type, SUM(calories) AS total_calories
FROM exercise_logs
GROUP BY type
HAVING total_calories > 150;

我得到了错误

消息 207,第 16 级,状态 1,第 2 行 列名称“total_calories”无效。

有人可以指出我做错了什么吗?谢谢。

sql sql-server t-sql having
4个回答
8
投票

Aggregation
是必需的,因为您无权访问别名
total_calories

SELECT   type,SUM(calories) AS total_calories 
FROM     exercise_logs 
GROUP BY type 
HAVING   SUM(calories) > 150;

5
投票

您还可以将

GROUP BY
查询包装在派生表中:

select type, total_calories 
FROM (
    SELECT type, SUM(calories) AS total_calories
    FROM exercise_logs
    GROUP BY type
) AS dt
WHERE total_calories > 150

3
投票

HAVING子句允许您根据聚合函数的结果进行过滤,例如SUM、MIN和MAX。您必须直接使用这些函数,遗憾的是 SELECT 子句中的列别名不能在此处重用。这是“逻辑处理顺序”的结果。摘自MSDN

以下步骤显示逻辑处理顺序,或绑定 order,用于 SELECT 语句。这个顺序决定了对象何时 在一个步骤中定义的内容可用于后续的子句 脚步。例如,如果查询处理器可以绑定(访问) FROM 子句中定义的表或视图、这些对象及其 列可供所有后续步骤使用。反过来, 因为 SELECT 子句是第 8 步,所以任何列别名或派生 该子句中定义的列不能被前面的引用 条款。但是,它们可以被后续子句引用,例如 ORDER BY 子句。请注意,实际的物理执行 语句由查询处理器确定,顺序可能会有所不同 从这个列表中。

1.来自

2.开

3.加入

4.哪里

5.分组依据

6.使用 Cube 或 ROLLUP

7.拥有

8.选择

9.独特

10.订购方式

11.顶部


2
投票
HAVING

中的聚合函数:


SELECT type , SUM(calories) AS total_calories FROM exercise_logs GROUP BY type HAVING SUM(calories) > 150;

© www.soinside.com 2019 - 2024. All rights reserved.