Być może naprawiłeś to za pomocą max
ale to nie dlaczego to się dzieje i jest trochę dziwaczne. Twój problem polega na tym, że Twoje podzapytanie, które przekłada się na pojedynczą kolumnę, nie jest zapytaniem zbiorczym, min
, maks
, suma
itp. i dlatego musi być dołączony do grupy przez
klauzula. Naprawiłeś to, pakując go w max
ponieważ maksimum pojedynczej wartości zawsze będzie stałe.
Ponieważ jednak podzapytanie samo w sobie jest zapytaniem analitycznym i zawsze zwróci tylko jeden wiersz, oczywistą rzeczą jest użycie sprzężenia kartezjańskiego w celu dodania go do zapytania. W składni jawnego łączenia jest to znane jako sprzężenie krzyżowe
.
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
)
Złączenie kartezjańskie ma złą reputację, ponieważ mnoży liczbę wierszy po jednej stronie sprzężenia przez liczbę wierszy po drugiej stronie. Ma jednak swoje zastosowania, szczególnie w takim przypadku.