所以我没有得到我一直得到的错误。
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美元。 有人可以帮助我指出我的错误。我确定它很简单,但我似乎无法在初学者那里得到它。
答案 0 :(得分:1)
您获得的错误是因为您正在尝试执行聚合(即sum
,avg
等)并且不包括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
条件。由于WHERE
在HAVING
之前执行,因此会减少需要汇总的结果数量。
答案 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)
以下是一些建议:
您应该采取添加substr(CUSTZIP,1,5),AVG(CUSTBAL)'的建议。分组。
在使用时要特别注意distinct和group by。