Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-00937 :Pas une fonction de groupe à groupe unique - Erreur de requête

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.