Je hebt het misschien opgelost met max
maar dat is niet waarom het gebeurt en is een beetje hacky. Uw probleem is dat uw subquery, die zich vertaalt in een enkele kolom, geen geaggregeerde query is, min
, max
, sum
etc en moet dus worden opgenomen in een group by
clausule. Je hebt dit opgelost door het te verpakken in max
omdat het maximum van een enkele waarde altijd constant zal zijn.
Aangezien uw subquery echter zelf een analytische query is en slechts één rij retourneert, is het voor de hand liggend om een cartesiaanse join te gebruiken om deze aan uw query toe te voegen. In de expliciete join-syntaxis staat dit bekend als de 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
)
De cartesiaanse join heeft een slechte reputatie omdat het het aantal rijen aan de ene kant van de join vermenigvuldigt met het aantal rijen aan de andere kant. Het heeft echter zijn nut, vooral in dit soort gevallen.