sql >> Base de Datos >  >> RDS >> Oracle

ORA-00937:No es una función de grupo de un solo grupo:error de consulta

Puede que lo hayas arreglado con max pero eso no es por qué está sucediendo y es un poco raro. Su problema es que su subconsulta, que se traduce en una sola columna, no es una consulta agregada, min , max , sum etc., por lo que debe incluirse en un group by cláusula. Arreglaste esto envolviéndolo en max ya que el máximo de un solo valor siempre será constante.

Sin embargo, como su subconsulta es, en sí misma, una consulta analítica y solo devolverá una fila, lo más obvio es usar una combinación cartesiana para agregarla a su consulta. En la sintaxis de combinación explícita, esto se conoce 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
                      )

La unión cartesiana tiene mala reputación porque multiplica el número de filas de un lado de la unión por el número de filas del otro. Sin embargo, tiene sus usos, especialmente en este tipo de casos.