2013-06-25 37 views
0

我正在写一个查询,我需要从基于AVG()聚合函数,条件选择语句结果,使用平均聚合函数内如果第

,但在MySQL它给误差错误代码: 1111, 无效使用组功能

select 
if(avg(FLD_TKTS) > 1 and avg(FLD_TKTS) <= 2 , '1-2' , 0) as fld_avg_1_2, 
if(avg(FLD_TKTS) > 3 and avg(FLD_TKTS) <= 4 , '3-4' , 0) as fld_avg_3_4 
from tbl 
group by region; 

是有其他的方法来做到这一点?

+3

您可以显示表信息?查询对我来说很好。 – KaeL

+1

查询看起来不错,必须用表格。 – sashkello

+0

不确定的MySQL,但在oracle或sql server中我们使用Case语句(因为没有if)这样的一些事情Select(case when avg(FLD_TKTS)> 1 then avg (FLD_TKTS)else 0 end)作为来自tbl的fld_avg按区域分组; –

回答

2

查询:

select 
CASE WHEN avg(FLD_TKTS) > 1 and avg(FLD_TKTS) <= 2 THEN '1-2' 
    ELSE '0' END as fld_avg_1_2, 
CASE WHEN avg(FLD_TKTS) > 3 and avg(FLD_TKTS) <= 4 THEN '3-4' 
    ELSE '0' END as fld_avg_3_4 
from tbl 
group by region 
+0

谢谢..它的工作.. – sourcecode

1
select 
    region, 
    if(fld_avg > 1 and fld_avg <= 2, '1-2', 0) as fld_avg_1_2, 
    if(fld_avg > 3 and fld_avg <= 4, '3-4', 0) as fld_avg_3_4 
from 
(
    select 
    region, 
    avg(FLD_TKTS) fld_avg 
    from 
    tbl 
    group by 
    region 
) a; 
+0

但子查询不是一个好的解决方案.. – sourcecode

+0

@sourcecode你为什么这么认为? – Tomalak

+0

子查询不是相关的子查询,所以应该非常高效。 – Kickstart

0

我觉得一个子查询将是一个很好的解决方案:

SELECT 
    IF(avg_fld_tkts > 1 and avg_fld_tkts <= 2 , '1-2' , 0) as fld_avg_1_2, 
    IF(avg_fld_tkts > 3 and avg_fld_tkts <= 4 , '3-4' , 0) as fld_avg_3_4 
(
    SELECT avg(FLD_TKTS) AS avg_fld_tkts 
    from tbl 
    group by region 
) t1