Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-00937:Non una funzione di gruppo a gruppo singolo - Errore di query

Potresti averlo risolto con max ma non è perché sta succedendo ed è un po' complicato. Il tuo problema è che la tua sottoquery, che si traduce in una singola colonna non è una query aggregata, min , max , sum ecc e così deve essere incluso in un group by clausola. Hai risolto il problema avvolgendolo in max poiché il massimo di un singolo valore sarà sempre costante.

Tuttavia, poiché la tua sottoquery è, di per sé, una query analitica e restituirà sempre solo una riga, la cosa più ovvia da fare è usare un join cartesiano per aggiungerla alla tua query. Nella sintassi di join esplicito questo è noto come 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
                      )

Il join cartesiano ha una cattiva reputazione in quanto moltiplica il numero di righe su un lato del join per il numero di righe sull'altro. Tuttavia, ha i suoi usi, specialmente in questo tipo di casi.