Vous l'avez peut-être corrigé avec max
mais ce n'est pas pourquoi ça se passe et c'est un peu hacky. Votre problème est que votre sous-requête, qui se traduit par une seule colonne, n'est pas une requête agrégée, min
, max
, sum
etc et doit donc être inclus dans un group by
clause. Vous avez corrigé cela en l'enveloppant dans max
car le maximum d'une seule valeur sera toujours constant.
Cependant, comme votre sous-requête est elle-même une requête analytique et ne renverra qu'une seule ligne, la chose évidente à faire est d'utiliser une jointure cartésienne pour l'ajouter à votre requête. Dans la syntaxe de jointure explicite, cela s'appelle la 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
)
La jointure cartésienne a une mauvaise réputation car elle multiplie le nombre de lignes d'un côté de la jointure par le nombre de lignes de l'autre. Il a cependant son utilité, surtout dans ce genre de cas.