0

エラー: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

なぜそれが起こっているのか誰かに教えてもらえますか?

4

3 に答える 3

4

あなたはそれを修正したかもしれmaxませんが、それが起こっている理由ではなく、少しハッキーです。あなたの問題は、単一の列に変換されるサブクエリが集計クエリではないためmin、句に含める必要があることです。単一の値の最大値は常に一定であるため、ラップすることでこれを修正しました。maxsumgroup bymax

ただし、サブクエリ自体は分析クエリであり、1行しか返さないため、デカルト結合を使用してクエリに追加することは明らかです。明示的な結合構文では、これは として知られていcross joinます。

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
     , 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 
 cross join (select count(*) as naoAvaliados
               from GMITEMOS j
              inner join GMCTLSLA k
                 on k.os = j.cd_numero_os 
                and k.item = j.item
              where j.situacao in ('A', 'I', 'P')
                and k.ordem = 99999
                    )
 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
                      )

デカルト結合は、結合の片側の行数をもう一方の行数で乗算するため、評判が悪いです。ただし、特にこの種の場合には、用途があります。

于 2012-07-05T18:10:04.033 に答える
1

これは、サブクエリ自体がグループ関数ではなくスカラー結果であるためです。どうやら発見したように、サブクエリに同等の結果をもたらすグループ関数を置き換えることで修正できます。

于 2012-07-05T18:10:04.027 に答える
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;
于 2014-10-09T08:24:25.297 に答える