Du har muligvis rettet det med max
men det er ikke hvorfor det sker og er en lille smule hacky. Dit problem er, at din underforespørgsel, som oversættes til en enkelt kolonne, ikke er en samlet forespørgsel, min
, max
, sum
osv. og skal derfor inkluderes i en gruppe efter
klausul. Du løste dette ved at pakke det ind i max
da maksimum af en enkelt værdi altid vil være konstant.
Men da din underforespørgsel i sig selv er en analytisk forespørgsel og kun vil returnere én række, er den oplagte ting at gøre at bruge en kartesisk join til at tilføje den til din forespørgsel. I den eksplicitte joinsyntaks er dette kendt som krydsforbindelse
.
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
)
Den kartesiske joinforbindelse har et dårligt ry, da den multiplicerer antallet af rækker på den ene side af sammenføjningen med antallet af rækker på den anden. Det har dog sine anvendelser, især i denne slags tilfælde.