sql >> Database >  >> RDS >> Oracle

ORA-00937:Geen groepsfunctie met één groep - Vraagfout

Je hebt het misschien opgelost met max maar dat is niet waarom het gebeurt en is een beetje hacky. Uw probleem is dat uw subquery, die zich vertaalt in een enkele kolom, geen geaggregeerde query is, min , max , sum etc en moet dus worden opgenomen in een group by clausule. Je hebt dit opgelost door het te verpakken in max omdat het maximum van een enkele waarde altijd constant zal zijn.

Aangezien uw subquery echter zelf een analytische query is en slechts één rij retourneert, is het voor de hand liggend om een ​​cartesiaanse join te gebruiken om deze aan uw query toe te voegen. In de expliciete join-syntaxis staat dit bekend als de 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
                      )

De cartesiaanse join heeft een slechte reputatie omdat het het aantal rijen aan de ene kant van de join vermenigvuldigt met het aantal rijen aan de andere kant. Het heeft echter zijn nut, vooral in dit soort gevallen.



  1. Oracle:Concat met scheidingsteken, maar alleen als beide operanden NIET NULL zijn

  2. Hoe te sorteren in SQL, artikelen negeren ('de, een', een etc)

  3. Krijg een woord na een specifiek woord met regexp_substr in sql oracle

  4. Een tabel maken met mysql, php en ajax (met jQuery)