'列名无效'在使用HAVING时

时间:2016-01-12 10:34:14

标签: sql sql-server having

我正在使用Microsoft SQL SERVER 2014。

以下是我的查询

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

我收到了错误

  

Msg 207,Level 16,State 1,Line 2   列名称无效' total_calories'。

这是一个非常简单的表(我是sql的新手并且正在学习它)。谁能指出我做错了什么?感谢。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

您需要HAVING中的聚合函数:

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

答案 3 :(得分:0)

HAVING子句允许您根据aggregate function的结果进行过滤,例如SUM,MIN和MAX。您必须直接使用这些函数,遗憾的是,SELECT子句中的列别名不能在此处重用。这是Logical Processing Order的结果。取自MSDN

  

以下步骤显示逻辑处理顺序或绑定   order,用于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