Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-00937:Não é uma função de grupo de grupo único - Erro de consulta


Você pode ter corrigido com max mas não é por isso está acontecendo e é um pouco hacky. Seu problema é que sua subconsulta, que se traduz em uma única coluna, não é uma consulta agregada, min , máximo , soma etc e, portanto, precisa ser incluído em um group by cláusula. Você corrigiu isso envolvendo-o em max pois o máximo de um único valor será sempre constante.

No entanto, como sua subconsulta é, em si, uma consulta analítica e retornará apenas uma linha, a coisa óbvia a fazer é usar uma junção cartesiana para adicioná-la à sua consulta. Na sintaxe de junção explícita, isso é conhecido como 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
                      )

A junção cartesiana tem uma má reputação, pois multiplica o número de linhas de um lado da junção pelo número de linhas do outro. No entanto, tem seus usos, especialmente neste tipo de caso.