繁体   English   中英

使用HAVING时'无效列名'

[英]'invalid column name' while using the HAVING

我正在使用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和学习它的新手)。 谁能指出我做错了什么? 谢谢。

由于您无法访问别名total_calories ,因此需要进行Aggregation

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

您还可以在派生表中包装GROUP BY查询:

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

您需要在HAVING使用聚合函数:

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

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

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

1.从

2.1936

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE或WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM