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.