使用带有聚合函数的having子句时出错

时间:2012-09-26 11:35:41

标签: sql

使用having子句时遇到问题。由于我不理解的原因,以下2个查询会产生一些错误。

以下查询会生成此错误:'having clause'中的未知列'number'

select avg(number),name from test
group by name
having avg(number) < number

然后以下查询生成此错误:'having clause'中的未知列'number'

select name from test 
group by name
having number=min(number)

为什么在number表中有test列时会出现这些错误?

1 个答案:

答案 0 :(得分:1)

HAVING仅对GROUP BY子句中列出的聚合列进行操作。对于这种情况,请使用WHERE代替HAVING,并使用相关查询来获取MIN(number),如下所示:

SELECT name 
FROM test 
WHERE number = (SELECT MIN(number) FROM test)
GROUP BY name

修改:您的第一个查询无法再次运行的原因相同,因为您无法将HAVINGGROUP BY子句中未列出的任何列一起使用。如果要获得第一个查询的相同结果,可以这样写:

SELECT AVG(t1.number), t1.name 
FROM test t1
INNER JOIN 
(
   SELECT name, AVG(number) Avg
   FROM test 
   GROUP BY name
) t2 ON t1.name = t2.name AND t1.number < t2.Avg
GROUP BY name