ORA-00937:不是单组组功能 - 查询错误

时间:2012-07-05 17:36:39

标签: database oracle

错误:ORA-00937:不是单组群组功能

查询:

    select count(*) todas,
       sum(case when i.prioridade = 1 then 1 else 0 end) urgente,
       sum(case when i.prioridade = 2 then 1 else 0 end) alta,
       sum(case when i.prioridade = 3 then 1 else 0 end) normal,
       sum(case when i.prioridade = 4 then 1 else 0 end) baixa,
       (select count(*)
        from GMITEMOS i 
        inner join GMCTLSLA c  on c.os = i.cd_numero_os and c.item = i.item
        where i.situacao in ('A', 'I', 'P')
           and c.ordem = 99999
           ) naoAvaliados,
       sum(case when i.situacao = 'P' then 1 else 0 end) pendentes,
       sum(case when i.situacao = 'A' or i.situacao = 'I' then 1 else 0 end) iniciados
from GMITEMOS i 
where i.situacao in ('A', 'I', 'P')
   and  exists (select 1 
               from GMCTLSLA c 
               where c.os = i.cd_numero_os 
                  and c.item = i.item)

此处出现错误:

(select count(*)
        from GMITEMOS i 
        inner join GMCTLSLA c  on c.os = i.cd_numero_os and c.item = i.item
        where i.situacao in ('A', 'I', 'P')
           and c.ordem = 99999
           ) naoAvaliados

有人能说出为什么会这样吗?

3 个答案:

答案 0 :(得分:4)

你可能已经用max修复了它,但这不是为什么它正在发生并且有点hacky。您的问题是您的子查询转换为单个列不是聚合查询,minmaxsum等,因此需要包含在{{1子句。您通过将其包装在group by中来修复此问题,因为单个值的最大值始终是恒定的。

但是,由于您的子查询本身是一个分析查询,并且只返回一行,显而易见的事情是使用笛卡尔联接将其添加到查询中。在显式连接语法中,这称为cross join

max

笛卡尔联接的声誉很差,因为它将联接一侧的行数乘以另一侧的行数。但它确实有它的用途,特别是在这种情况下。

答案 1 :(得分:1)

这种情况正在发生,因为子查询本身是标量结果,而不是组函数。正如您明显发现的那样,您可以通过替换为您的子查询产生等效结果的组函数来修复它。

答案 2 :(得分:0)

在合并声明中,如果您收到此错误而不是简单地使用group by,它将解决此问题。

merge into table1 tb1
using
   (select a.id,a.ac_no,sum(a.qy) as qyt,sum(a.amt) as sum_amt from 
    table2 a, table1 b
    where a.id=b.id
    and a.id = '1234'
    and a.date = '08Oct2014'
    and a.ac_no in (123, 234, 345)
    and a.ac_no = b.ac_no
    group by a.ac_no,a.id
   )qry
  on (qry.id=tb1.id and qry.ac_no=tb1.ac_no )
  when matched then
  update set qy=qry.qy,amt = qry.sum_amt;