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.