Pular para o conteúdo
  • Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 4 anos, 5 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #146045
    Avatar de LHCLHC
    Participante

      Senhores especialistas de plantão poderiam me ajudar com uma situação e entendimento?

       

      Estou tentando gerar uma consulta que me retorne cada produto vendido em uma faixa de data (no exemplo 01/09/2019 a 02/09/2019)

      A consulta retorna os produtos certim, consigo fazer um outro select para que faça a soma do campo qn_pesovenda (Seria o campo onde fica registrado cada peso de venda do produto vendido) eu queria que ele retorna-se esse valor na frente de cada produto!

      Existe uma forma do oracle entender que a variável(campo CODPRD) que eu selecionei faça a soma por produto e informe na coluna PR no exemplo a seguir?

      Nota-se que o final da query: and vw.ie_mateemba = ‘codprd’ eu consigo fazer com que o oracle entenda que é pra pegar os produtos selecionados antes?

      select distinct vw.ie_mateemba codprd,
      (select sum(qn_pesovenda) PR from vw_tm_produtos@lnkedata vw where vw.dt_estoregiprod >= ’01/09/2019′ and vw.dt_estoregiprod <= ’02/09/2019′ and vw.fl_oper = ‘E’ and vw.fl_tipooper = ‘PR’ and vw.id_almoxarifado = ‘222’ and vw.ie_mateemba = ‘codprd’) PR
      from vw_tm_produtos@lnkedata vw
      where vw.dt_estoregiprod >= ’01/09/2019′ AND vw.dt_estoregiprod <= ’02/09/2019′
      ORDER BY CODPRD

       

      Dês de já agradeço os comentários de quem puder me auxiliar.

       

       

      #146047
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Blz ? Então, tem *** DIVERSOS *** pontos questionáveis (ou simplesmente errados, ou pelo menos NÃO RECOMENDÁVEIS) aí nessa sua query :

        1. vc não diz mas eu IMAGINO (pelo nome delas) que essa coluna DT_ESTOREGIPROD é do tipo DATE, e esa coluna ID_ALMOXARIFADO é do tipo NUMBER – se forem, vc NÂO DEVERIA NUNCA usar aspas simplesmente para datatype que não sejam string, sem pelo menos aplicar uma função de conversão : isso VAI CAUSAR uma conversão implícita, que como eu já disse N+1! vezes aqui mesmo neste Fórum, é uma prática que CEDO OU TARDE vai te “morder no calcanhar”…. Não é SE, é QUANDO…..
        2. ainda supondo que a coluna DT_ESTOREGIPROD é do tipo DATE, IMAGINO que vc SAIBA que no RDBMS Oracle o datatype DATE ** INESCAPAVALMENTE ** já contém tambpem um componente de HORA : como Não Sabemos SE a sua aplicação está ou não preenchendo essa porção de HORA nessa coluna DATE, imho é simplesmente uma MEDIDA DE SEGURANÇA vc PROGRAMAR SEUS SQLs como se isso estivesse sendo feito, tal como EU vou fazer no meu exemplo mais abaixo….
        3. Essa funcionalidade que vc cita (ie, de fazer uma SOMA ‘juntando’ (ou melhor dizendo, AGRUPANDO) os registros que vc quer informar para a operação (de SOMA no seu caso) de acordo com uma coluna-chave (que é essa coluna VW.IE_MATEEMBA com o ALIAS de CODPRD), vc faz na linguagem SQL (e isso é um CONCEITO GERAL DE RDBMSs, não só e apenas no Oracle!!) OU com GROUP BY OU com ANALYTICS…. O que te leva a escolher um ou outro é a necessidade de EXIBIR no SELECT as colunas afora a coluna-chave ou não…. Usarei o GROUP BY na minha resposta já que ao que entendo vc quer exibnir só a coluna-chave E a soma pra cada valor da coluna-chave….
        4. TEU ERRO PRINCIPAL aqui é vc ler a MESMA tabela/view/fonte de dados (essa VW_TM_PRODUTOS) ** duas vezes **, uma vez pra ler os registros e outra pra fazer a soma de cada produto… Isso simplesmente NÂO FAZ SENTIDO!!!! A funcionalidade de AGRUPAÇÂO nos RDBMSs existe JUSTAMENTE PARA EVITAR ISSO !!!!
        5. Finalmente, para vc tomar uma DECISÃO (perguntar se a DT_ESTOREGIPROD está dentro de um range, no seu caso E as condições outras, como vw.oper = ‘E’, vw.fl_tipooper = ‘PR’ e vw.id_almoxarifado = ‘222’ ) vc usa o CASE, ele é o ‘IF’ da linguagem SQL…. E pra filtrar por RANGE eu SEMPRE Prefiro usar o BETWEEN , não >= e <= : imho é MUITO MAIS CLARO o BETWEEN !!!

        Aí , respondendo, teu SELECT ficaria mais ou menos assim :

        select vw.ie_mateemba codprd, 
           SUM(
               CASE when vw.fl_oper          = 'E'
                     and vw.fl_tipooper      = 'PR'
                     and vw.id_almoxarifado  = 222
                THEN qn_pesovenda
                ELSE 0 
                END 
              ) as PR       
          from vw_tm_produtos@lnkedata vw
         where vw.dt_estoregiprod BETWEEN to_date('01/09/2019 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
                                      AND to_date('02/09/2019 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
         GROUP BY vw.ie_mateemba
         ORDER BY CODPRD;

        ==> e é isso… Claro, eu NÂO TESTEI ISSO AQUI porque vc Não Nos Deu nem CREATE TABLEs nem DADOS, mas SE eu entendi direito a sua necessidade (que afaik é somar a coluna QN_PESOVENDA para cada IE_MATEEMBA mas apenas se as condições que codifiquei no CASE forem verdadeiras), a query que vc vai escrever é mais ou menos no estilo desse exemplo aí… MUITO simples, quando se aplica os Conceitos corretos….

        Abraços,

        Chiappa

        #146050
        Avatar de LHCLHC
        Participante

          Brother excelente explicação, deu para entender legal e consegui ajustar em cima do que eu estava precisando.

          Obrigado pela ajuda.

           

          Deus te abençoe.

          #146051
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Maravilha – e mais importante do que só executar uma cópia do exemplo é vc Entender os Conceitos e Best Practices todos que apresentei para uso em casos futuros, espero ter sido capaz de os passar….

            E fico contente em poder ter te Ajudado a resolver seu problema imediato…

             

            Abraços,

             

            Chiappa

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.
          plugins premium WordPress