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 Aureo Almeida
      Eu possuo em uma página em que existe um menu, com categorias inseridas a partir de um banco de dados, e na mesma página uma listagem de produtos.
      A função deste menu é enviar para a clausula where do SQL que lista os produtos parâmetros que permitam filtro dos produtos. Faço isso com a variável $_GET, da seguinte forma:
      $sub_id = $_GET['sct_id']; Isso funciona certinho, porém o problema é que quando a página é carregada, a não ser que seja feita uma opção no menu para selecionar os produtos, a listagem deles volta vazia e com o seguinte erro:
      array(0) { } Notice: Undefined index: sct_id in D:\XAMPP\htdocs\projeto\arq\cosm.php on line 76 Tentei desenvolver as seguinte condições que mudassem o SQL,  mas não consegui fazer dar certo:
      if(empty($sub_id = array(0))) $sql = "SELECT * FROM psd_produtos WHERE ctg_id = 1"; else { $sql = "SELECT * FROM psd_produtos WHERE ctg_id = 1 AND sct_id = '$sub_id'"; } Como fazer com que o SQL que orienta a consulta quando a página for carregada seja um, e quando passo parâmetro via GET seja outro?
    • By thunanchiu@hotmail,com
      Bom dia, gostaria dessa ajuda.
      Tenho uma tabela de "INSCRIÇÃO" onde a mesma possui 2 chaves estrangeiras (CAND_SQ e CANDPL_SQ). Ambas as chaves estrangeiras possuem um campo CPF.
      Gostaria de saber como eu trago os cpfs que são iguais dentro da inscrição.
      Ou seja, atualmente tenho uma INSCRIÇÃO onde pode ser feita de duas maneiras diferentes. Inscrição Regular e Inscrição Atraso. Quando eu for fazer a Inscrição Atraso, caso eu já tenha feito a Inscrição Regular não poderei fazer a Inscrição Atraso.
    • By TaisStream
      Como configurar essa query com inner join, no arquivo .xml?
      Me ajudem pf eu comecei mas estou perdida,  pesquisei já vi algo de /root... mas minha query esta diferente, nao sei se falta algo
       
       
      QUERY ATUAL:
      set mapreduce.job.queuename=low_relatorios; 
      set mapreduce.job.max.split.locations=100;
      SELECT a.num_msisdn,
             a.max_date
      FROM fact.dw_f_rcrg_gems_rate_subsc t
      INNER JOIN
        (SELECT num_msisdn,
                MAX(dat_operacao) AS max_date
         FROM fact.dw_f_rcrg_gems_rate_subsc
         WHERE (ref_date)>=$startdate
           AND ref_date<=$finaldate
           AND ide_plano_tarifario_atual IN (48,
                                             50,
                                             51,
                                             52,
                                             53,
                                             59,
                                             61,
                                             62,
                                             63,
                                             67,
                                             73,
                                             74)
         GROUP BY num_msisdn)a ON a.num_msisdn = t.num_msisdn
      AND a.max_date = t.dat_operacao
      WHERE ref_date>=$startdate
      AND ref_date<=$finaldate;
       
      QUERY CONFIGURANDO NO XML: 
       
          <value><![CDATA[[
      INSERT
              overwrite TABLE fact.dw_f_rcrg_gems_rate_subsc t 
              (
                      a.num_msisdn,
                      a.max_date
              )
      (SELECT
          INNER JOIN
      SELECT      
              MAX(dat_operacao) AS max_date;
      FROM fact.dw_f_rcrg_gems_rate_subsc) a
         WHERE (ref_date)>='$startdate'
           AND ref_date<=$'finaldate'
           AND ide_plano_tarifario_atual IN (48,
                                             50,
                                             51,
                                             52,
                                             53,
                                             59,
                                             61,
                                             62,
                                             63,
                                             67,
                                             73,
                                             74)
         GROUP BY num_msisdn)a ON a.num_msisdn = t.num_msisdn
                  AND a.max_date = t.dat_operacao
      WHERE ref_date>='$startdate'
      AND ref_date<=$finaldate;]]>
      </value>
       
       
      Poderiam me ajudar por favor, sou estagiario na area e ainda estou aprendendo.
    • By Richard.Ribeiro
      Boa tarde a todos, Uma ajuda Por favor, alguém pode me explicar porque sempre que eu digito no" input name=vsat" e clico em buscar a DIV do " select id=rightValues" SOME
      alguem poderia ajudar? o erro está no  PHP ou JS
      desde já agradeço a atenção.
      <style media="screen">
      SELECT, INPUT[type="text"] {
        width:500px;
        box-sizing: border-box;
      }
      SELECT, INPUT[type="button"] {
        font-size: 20px;
      }
      SECTION {
        padding: 8px;
        background-color: #f0f0f0;
        overflow: auto;
      }
      SECTION > DIV {
        float: left;
        padding: 30px;
      }
      SECTION > DIV + DIV {
        width: 200px;
        text-align: center;
      }
      </style>
      <section class="container">
      <form  method="post">
        <?php
        if (isset($_POST['buscar'])) {
            $id_gmm = $_POST['gmm'];
          }elseif (isset($_POST['buscar2'])){
                $vsat = $_POST['vsat'];
            }
            ?>
      <h2><i class="fa fa-link"></i> Vincular Componentes a VSAT</h2>
      <h4><i class="fa fa-arrow-down"></i> Itens da GMM</h4>
          <div>
            <input type="text" name="gmm"  placeholder="Digite o N° da GMM">
            <input type="submit" name="buscar" value="buscar"><br>
              <select id="leftValues" size="5" multiple>
                <?php
                $consultaGmm = ConexaoBD::conectar()->prepare("SELECT tipo_material_id FROM itens_fornecidos WHERE gmm_id = $id_gmm ");
                $consultaGmm->execute();
                $consultaGmm = $consultaGmm->fetchAll();
                foreach ($consultaGmm as $key => $value) {
               ?>
              <option value="<?php echo  $value['tipo_material_id'];?>">
               <?php echo $value['tipo_material_id']; ?>
               </option>
            <?php }?>
            </select>
          </div>
          <div>
              <input type="button" id="btnLeft" value="&lt;&lt;" />
              <br>  <br>
              <input type="button" id="btnRight" value="&gt;&gt;" />
          </div>
          <div>
            <label for="">VSAT</label>
            <input type="text" name="vsat"  placeholder="Digite o ID/IDE da VSAT">
            <input type="submit" name="buscar2" value="buscar"><br>
              <select id="rightValues" size="4" multiple>
                <?php
                $consultaVsat = ConexaoBD::conectar()->prepare("SELECT estoque_material_id FROM componentes_instalados WHERE estoque_material_id = $vsat ");
                $consultaVsat->execute();
                $consultaVsat = $consultaVsat->fetchAll();
                foreach ($consultaVsat as $key => $valueVsat) {
               ?>
               <option value="<?php echo $valueVsat['estoque_material_id'];?>">
                 <?php echo $valueVsat['estoque_material_id']; ?>
               </option>
             <?php } ?>
              </select>
          </div>
      </form>
      </section>
      <script  src="<?php echo INCLUDE_PATH_PAINEL ?>js/jquery-3.4.1.min.js"></script>
      <script src="<?php echo INCLUDE_PATH_PAINEL ?>js/main.js"></script>
      <script type="text/javascript">
      $("#btnLeft").click(function () {
          var selectedItem = $("#rightValues option:selected");
          $("#leftValues").append(selectedItem);
      });
      $("#btnRight").click(function () {
          var selectedItem = $("#leftValues option:selected");
          $("#rightValues").append(selectedItem);
      });
       
      </script>
      <?php die(); ?>
       
       
    • By Rui PG
      Boa tarde, Pessoal"
       
      Sou iniciante em SQL, em uma tabela do nosso BD tempos um campo que possui o registro com as informações do paciente concatenado com uma serie de valores que não precisamos.
      Como eu faço, para montar uma select para extrair desse registro apenas o que está entre aspas?
       
      O meu registro está assim:
      a:28:{i:18;s:13:"Sérgio silva";i:19;s:11:"1199900001";i:20;s:0:"n/i";i:21;s:0:"n/i";i:23;s:15:"Amil One Health";i:24;s:0:"n/i";i:27;s:0:"n/i";i:31;s:1:"2";i:32;s:0:"n/i";i:33;s:1:"2";i:34;s:0:;}
       
      Eu preciso dele assim:
      "Sérgio silva";"1199900001";"n/i";"n/i";"Amil One Health";"n/i";"n/i";"2";"n/i";"2";
       
      Observação, esses monte de valores a:28: ...etc... eles mudam, não são valores fixos, se fossem até usaria o replace, mas são vários valores.
       
      Depois que eu chegar nessa mineração: "Sérgio silva";"1199900001";"n/i";"n/i";"Amil One Health";"n/i";"n/i";"2";"n/i";"2";
      Como eu faço para alocar cada valor em campo campo qualquer, pode ser uma tabela temporária, tipo assim:
       
      |nome           |campo 1        |Campo 2 |Campo 3 |Campo 4               |Campo  5 | .....
      |Sérgio silva|1199900001|n/i              |n/i              |Amil One Health|n/i               |n/i|2|n/i|2| .....
       
      Muito obrigado amigos
       
       
       
       
       
       
×

Important Information

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