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.