Jump to content
Viniciusr9

[Resolvido] ORA-00937: Não é uma função de grupo de grupo simples

Recommended Posts

Boa tarde pessoal,

Sei que tem varios tópicos sobre esse erro, porém analisei todos e nenhum foi aplicável ao meu caso ( a maioria era porquê o pessoal esquecia do Group By ao final das Querys) . 

Se alguém puder ajudar, agradeço . Os campos sem função estão inseridos no group by, porém o erro persiste .

 

 


 

SELECT * FROM(
select  
    LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO,
    E.DS_EQUIPE as EQUIPE,
    SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) as "ESFORÇO CALCULADO"     
 from EQUIPE E,
    COLABORADOR C1,
    COMPETENCIA C,
    COMPETENCIA_COLABORADOR CC,
    AUSENCIAS AU
 where E.CD_EQUIPE=CC.CD_EQUIPE
    and C.CD_COMPETENCIA=CC.CD_COMPETENCIA
    and C1.CD_COLABORADOR=CC.CD_COLABORADOR
    and C1.STATUS = 1
    AND C1.CD_GESTOR <> C1.CD_COLABORADOR
    AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR   
    GROUP BY E.DS_EQUIPE, LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA
) VT
WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))

 

Share this post


Link to post
Share on other sites
SELECT * FROM(
select  
    LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO,
    E.DS_EQUIPE as EQUIPE,
    SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) as "ESFORÇO CALCULADO"     
 from EQUIPE E,
    COLABORADOR C1,
    COMPETENCIA C,
    COMPETENCIA_COLABORADOR CC,
    AUSENCIAS AU
 where E.CD_EQUIPE=CC.CD_EQUIPE
    and C.CD_COMPETENCIA=CC.CD_COMPETENCIA
    and C1.CD_COLABORADOR=CC.CD_COLABORADOR
    and C1.STATUS = 1
    AND C1.CD_GESTOR <> C1.CD_COLABORADOR
    AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR   
    GROUP BY CC.QT_HORAS_CHEIA,U.DT_FIM,AU.DT_INI,E.DS_EQUIPE, LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA
) VT
WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))

 

Share this post


Link to post
Share on other sites
13 minutos atrás, Motta disse:

SELECT * FROM(
select  
    LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO,
    E.DS_EQUIPE as EQUIPE,
    SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) as "ESFORÇO CALCULADO"     
 from EQUIPE E,
    COLABORADOR C1,
    COMPETENCIA C,
    COMPETENCIA_COLABORADOR CC,
    AUSENCIAS AU
 where E.CD_EQUIPE=CC.CD_EQUIPE
    and C.CD_COMPETENCIA=CC.CD_COMPETENCIA
    and C1.CD_COLABORADOR=CC.CD_COLABORADOR
    and C1.STATUS = 1
    AND C1.CD_GESTOR <> C1.CD_COLABORADOR
    AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR   
    GROUP BY CC.QT_HORAS_CHEIA,U.DT_FIM,AU.DT_INI,E.DS_EQUIPE, LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA
) VT
WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))

 

Continua o mesmo erro , mesmo incluindo o AU.DT_FIM e DT_INI no group by..

Share this post


Link to post
Share on other sites

Tira os dt_fim e dt_ini do group by ...

 

Share this post


Link to post
Share on other sites

O erro persiste Motta. Pelo que eu tava lendo na net, eu não posso ter duas funções de grupo aninhadas do tipo :

SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) 

 

porém eu preciso dela pois eu preciso reduzir o QT_HORAS_CHEIA( horas totais)  de SUM(AU.DT_FIM - AU.DT_INI)*24 que são as horas faltadas pra ter um retorno de horas reais. o SUM de fora acumula tudo pra mim, sem ele dá tudo errado . 

Será que tem alguma maneira de converter isso e retirar um SUM porém tendo o mesmo retorno ?

Share this post


Link to post
Share on other sites

Tenta colocar as colunas

 

QT_HORAS_CHEIA
DT_FIM
DT_INI

 

na subquery sem totalizar e totalizar no select externo

Share this post


Link to post
Share on other sites

Desse jeito ? , assim me retorna apenas o resultado de 1501 , porém o correto que eu necessito é

( EQUIPE 1 = 1299

  EQUIPE 2 = 1010

  EQUIPE 3 = 147)

 

SELECt SUM(NVL((VT.QT_HORAS_CHEIA - SUM(VT.DT_FIM - VT.DT_INI)*24 ),VT.QT_HORAS_CHEIA)) FROM(
select  
    LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO,
    E.DS_EQUIPE as EQUIPE,
    AU.DT_FIM,
    AU.DT_INI,
    QT_HORAS_CHEIA
       
 from EQUIPE E,
    COLABORADOR C1,
    COMPETENCIA C,
    COMPETENCIA_COLABORADOR CC,
    AUSENCIAS AU
 where E.CD_EQUIPE=CC.CD_EQUIPE
    and C.CD_COMPETENCIA=CC.CD_COMPETENCIA
    and C1.CD_COLABORADOR=CC.CD_COLABORADOR
    and C1.STATUS = 1
    AND C1.CD_GESTOR <> C1.CD_COLABORADOR
    AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR   
    AND TO_DATE(LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA,'MM/RRRR') = TRUNC(SYSDATE,'MM')
   -- GROUP BY CC.QT_HORAS_CHEIA,C1.DS_COLABORADOR 
) VT
WHERE TO_DATE(VT.PROJETO,'MM/RRRR') = TRUNC(SYSDATE,'MM')

GROUP BY VT.QT_HORAS_CHEIA,VT.EQUIPE,vt.projeto, vt.dt_ini,vt.dt_fim
--WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))
 

Share this post


Link to post
Share on other sites

Fiz o SUM externo no Select externo e o restante mantive como o primeiro scritp que te mandei, fiz o group by dentro e fora , ai funcionou certinho. Ficou 

SELECt VT.PROJETO,SUM(VT.ESFORCO_CALC),VT.EQUIPE FROM(

-- SCRIPT PRIMARIO -- 

) VT
WHERE TO_DATE(VT.PROJETO,'MM/RRRR') = TRUNC(SYSDATE,'MM')

GROUP BY VT.EQUIPE,VT.PROJETO

 

. Muito Obrigado Motta !

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By mzaidan
      Pessoal, estou meio enferrujado, voltando depois de alguns anos sem mexer em nada.
      Queria uma pequena ajuda, se possível.
       
      Seguinte:
      Tenho uma tabela com nome e faixa do cara (jiu jitsu).
      Por exemplo:
      Nome     | Faixa
      AlunoA   | branca
      AlunoB   | branca
      AlunoC   | azul
      AlunoD   | azul
      AlunoE   | marrom
      AlunoF   | roxa
      AlunoG   | preta
       
      Queria fazer um sql (na verdade vou usar em php), que me retornasse assim:
       
      Faixa Branca:
      AlunoA
      AlunoB
      Faixa Azul:
      AlunoC
      AlunoD
      Faixa Roxa:
      AlunoF
      Faixa Marrom:
      AlunoE
      Faixa Preta:
      AlunoG
       
      O que eu poderia fazer??
       
      Desde já agradeço.
    • By RAFAEL C D EMELO
      Bom dia amigos,
       
      me deparei com um problema estou criando uma procedure que precisa criar uma PK em uma tabela ja existente e apos isso realizar um insert porem quando existe um dado duplicado por algum motive a exception DUP_VAL_ON_INDEX NAO FUNCIONA  o insert funcionou mas quando testo uma situacao de duplicacao eu recebo um erro oracle 02260 e diz que a tabela somente pode ter uma PK porem a exception deveria tartar o erro ,
      eu vou deixar o codigo a baixo par se alguem puder me ajudar isso
      desde ja agradeco a todos,
       
      CREATE OR REPLACE PROCEDURE MANUAL_CLIENT_INSERT_FIP AS
      Y_CONT NUMBER := 0;
      W_CONT NUMBER;
          BEGIN 
           
           EXECUTE IMMEDIATE 'ALTER TABLE TEMP_FIP_CLIENT_HISTORIC
                              ADD PRIMARY KEY (CLIENTKEY)';
           
              FOR REG IN (SELECT LOADDATE,
                          CLIENTKEY,
                          CLIENTSEGMENT,
                          CLIENTNAME,
                          'UK' AS COUNTRY,
                          'FIP' AS PROGRAM,
                          'TPL' AS COVERAGE
              FROM TEMP_FIP_CLIENT_HISTORIC
      )
       LOOP
       
        BEGIN
          W_CONT := NVL(W_CONT, 0)+ 1;
                
           DBMS_OUTPUT.PUT_LINE('RECORDS' ||'-'|| W_CONT ||' '||REG.LOADDATE||' '||REG.CLIENTKEY||' '||REG.CLIENTSEGMENT||' '|| REG.CLIENTNAME||' '||'UK'||' '||'FIP'||' '||'TPL');
                                                
            INSERT INTO GV_MANUAL_CLIENT(LOADDATE, CLIENTKEY,  CLIENTSEGMENT,   CLIENTNAME,  COUNTRY,  PROGRAM,  COVERAGE )
            VALUES                      (SYSDATE,  REG.CLIENTKEY, REG.CLIENTSEGMENT, REG.CLIENTNAME, REG.COUNTRY, REG.PROGRAM, REG.COVERAGE);
         
         
         EXCEPTION
               WHEN DUP_VAL_ON_INDEX THEN
               DBMS_OUTPUT.PUT_LINE(W_CONT ||'  '||'DUPLICATE KEY');  
          END; 
         
       END LOOP;
      END;
    • By matlaureto
      Pessoal, boa tarde!!!
      Gostaria de uma opinião de vocês... sempre trabalhei no Oracle utilizando left join, inner join, e não a marcação de join especifica da oracle (+).
      Quando estudei para a certificação 1Z0-047, OCE SQL Expert, lá mesmo falava para não utilizar a marcação (+) por se tratar de um código depreciado.
      Alguem sabe informar se essa marcação realmente é depreciada? Estou trabalhando em uma empresa onde o padrão dos joins é com esta marcação da Oracle, então to buscando informações sobre isso.
      Alguem sabe me orientar quanto a isso?
      Muito obrigado a todos!!
    • By Dinho Nunes LC
      <div align="center" id="subtitulo"> Canais Abertos </div> <div class="ui cards"> <div class="card"> <div class="content"> <a href="globo.html" style="display: block; color: black"> <div align="center"> <div> <img class="ui tiny image" id="imagem_card_casa" src="assets/images/Rede_Globo_2014.png"> <div align="center" id = "nome_time_fora"> <b>Globo RJ</b> </div> </div> Onde "globo.html" seria substituído pelo link que esta em uma tabela do banco de dados.
       
      Já fiz a conexão. E tenho a base de dados pronta.
       
      Motivo pelo qual estou buscando ajuda:
       
      Faço manualmente a mudança de cada link (são mais de 300) diariamente para evitar copias de terceiros. Sendo assim poderia usar um CRUD para facilitar a troca dos links direto no banco de dados.
    • By jeanzinsousa
      Salve, Galera estou com uma dúvida estudando banco de dados e programação.
       
      escrevi a seguinte query:
       
      SELECT data_pg as diaria, SUM(valor_pg) as valor_diario, SUM(valor_despesa) as valor_despesa, (SELECT SUM(valor_pg) as dinheiro FROM pagamento WHERE tipo = 5 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_dinheiro, (SELECTSUM(valor_pg) as debito FROM pagamento WHERE tipo = 25 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_debito, (SELECT SUM(valor_pg) as credito FROM pagamento WHERE tipo = 15 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) astotal_credito FROM pagamento WHERE MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019 GROUP BY diaria ORDER BY `diaria`
       
      resultado:
      diaria  1 valor_diario valor_despesa total_dinheiro total_debito total_credito   2019-06-10 818.70 0 288.40 586.95 113.30 2019-06-11 169.95 0 288.40 586.95 113.30
       
       
       
       
      Como podem ver meu objetivo e separar por dia o resultado dos valores divididos por tipo de pagamento.
      porém o mesmo mostra a soma total nas subquery.
      quando coloco o group by order by dentro das subquerys apresenta a seguinte mensagem de erro: #1242 - Subquery returns more than 1 row 
       
       
      como resolver?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.