Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-00937:Keine Einzelgruppen-Gruppenfunktion – Abfragefehler

Möglicherweise haben Sie es mit max behoben aber das ist nicht warum es passiert und ist ein bisschen hacky. Ihr Problem ist, dass Ihre Unterabfrage, die in eine einzelne Spalte übersetzt wird, keine aggregierte Abfrage ist, min , max , Summe usw. und muss daher in eine group by eingeschlossen werden Klausel. Sie haben dies behoben, indem Sie es in max eingeschlossen haben da das Maximum eines einzelnen Wertes immer konstant ist.

Da Ihre Unterabfrage jedoch selbst eine analytische Abfrage ist und immer nur eine Zeile zurückgibt, ist es naheliegend, eine kartesische Verknüpfung zu verwenden, um sie zu Ihrer Abfrage hinzuzufügen. In der expliziten Join-Syntax ist dies als 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
                      )

Der kartesische Join hat einen schlechten Ruf, da er die Anzahl der Zeilen auf einer Seite des Joins mit der Anzahl der Zeilen auf der anderen Seite multipliziert. Es hat jedoch seinen Nutzen, besonders in solchen Fällen.