SQL GROUP BY和HAVING

时间:2014-09-24 03:16:44

标签: sql group-by having-clause

所以我没有得到我一直得到的错误。

 select distinct substr(CUSTZIP, 1,5), AVG(CUSTBAL), custcity, custstate
 from customer
 group by CUSTCITY, custstate
 having CUSTSTATE = 'wa' AND avg(CUSTBAL) >100;

错误表示"不是GROUP BY表达式"它建议添加' substr(CUSTZIP,1,5),AVG(CUSTBAL)'对于group by子句,但这也不起作用。 我想要做的是列出仅在西澳大利亚州城市的邮政编码和余额平均值,余额超过100美元。 有人可以帮助我指出我的错误。我确定它很简单,但我似乎无法在初学者那里得到它。

3 个答案:

答案 0 :(得分:1)

您获得的错误是因为您正在尝试执行聚合(即sumavg等)并且不包括select子句中的所有列你的group by条款。如果您正在选择列,那么在使用聚合函数时,您应该按该列进行分组。

在您的特定情况下,您需要在substr(custzip, 1,5)条款中添加group by

select substr(custzip, 1,5), custcity, custstate, avg(custbal)
from customer
where custstate = 'wa'
group by substr(custzip, 1,5), custcity, custstate
having avg(custbal) > 100;

此外,请注意,您可以删除distinct,因为group by也会处理此问题。

我已将custstate = 'wa'移至WHERE条件。由于WHEREHAVING之前执行,因此会减少需要汇总的结果数量。

答案 1 :(得分:1)

问题不在于having子句。这是substr(CUSTZIP, 1, 5)。以下是解决问题的一种方法:

select substr(CUSTZIP, 1, 5), AVG(CUSTBAL), custcity, custstate
from customer
group by CUSTCITY, custstate, substr(CUSTZIP, 1, 5)
having CUSTSTATE = 'wa' AND avg(CUSTBAL) > 100;

顺便说一下,select distinct几乎不需要group by

或者,您可以使用聚合函数:

select max(substr(CUSTZIP, 1, 5)), AVG(CUSTBAL), custcity, custstate
from customer
group by CUSTCITY, custstate
having CUSTSTATE = 'wa' AND avg(CUSTBAL) > 100;

答案 2 :(得分:0)

以下是一些建议:

  1. 您应该采取添加substr(CUSTZIP,1,5),AVG(CUSTBAL)'的建议。分组。

  2. 在使用时要特别注意distinct和group by。