Anda mungkin telah memperbaikinya dengan max
tapi bukan itu mengapa itu terjadi dan sedikit hacky. Masalah Anda adalah bahwa sub-kueri Anda, yang diterjemahkan ke dalam satu kolom bukanlah kueri agregat, min
, max
, sum
dll dan perlu dimasukkan dalam group by
ayat. Anda memperbaikinya dengan membungkusnya dengan max
karena nilai maksimum dari satu nilai akan selalu konstan.
Namun, karena sub-kueri Anda sendiri adalah kueri analitik dan hanya akan mengembalikan satu baris, hal yang jelas harus dilakukan adalah menggunakan gabungan cartesian untuk menambahkannya ke kueri Anda. Dalam sintaks gabungan eksplisit, ini dikenal sebagai 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
)
Gabungan cartesian memiliki reputasi buruk karena mengalikan jumlah baris di satu sisi gabungan dengan jumlah baris di sisi lain. Namun, ia memiliki kegunaannya, terutama dalam kasus seperti ini.