在where子句中使用没有聚合函数的组函数无效

时间:2014-03-04 15:13:17

标签: mysql sql group-by

得到一个错误,我没有正确分组或我正在分组的内容是不允许的,但我搜索了一下,没有看到这样的情况。发生此错误的所有其他帖子在where子句中都有一个聚合函数。除非我完全删除分组,否则什么都不会改变。在where子句中使用实际日期而不是

>= NOW() - INTERVAL 30 DAY

不会改变结果。

我正在寻找一个支持代理人的名字,一个适用于他们所在案件的标签,该代理商在该标签上的平均评级,以及他们使用该标签处理的票数。< / p>

这是我正在运行的查询:

select a.public_name, 'settings', format(avg(r.rating),2) as 'average', 
count(label_name), pk_case_id
from bi.support_agents_list a 
    join bi.support_ratings_agents sra 
    on a.desk_id = sra.agent_desk_id
    join bi.support_ratings r 
    on sra.response_id = r.response_id
    and r.survey_id = sra.survey_id
    join bizdw.support_labels_assigned_v2 l
    on l.fk_case_id = r.pk_case_id
where r.date_submitted >= NOW() - INTERVAL 30 DAY
and a.start_date < '2014-01-22'
and a.end_date is null
and lower(l.label_name) in ('settings',
'settings-contributor'
'settings-socialaccount')
group by a.public_name, 'settings', format(avg(r.rating),2), pk_case_id
order by a.public_name, format(avg(r.rating),2), label_name desc

2 个答案:

答案 0 :(得分:0)

这是您的group by条款:

group by a.public_name, 'settings', format(avg(r.rating),2), pk_case_id

常量'settings'是不必要的(允许但不做任何事情)。 format(avg(r.rating),2)导致错误。该条款可以简单地为:

group by a.public_name, pk_case_id

答案 1 :(得分:0)

你正在根据格式(avg(r.rating),2)和其他列进行分组甚至avg(r.rating)本身将根据整个表或基于group by计算,所以你不能在group by中包含计算列,这不是逻辑正确的。

如果是您的要求,那么首先您必须根据productname和其他必需列在派生查询中获得avg(评级),然后您可以将此派生表与主表连接,并且您还可以包含avg(​​rating)列group by子句以及其他列,如productnames等。