Marcado: oracle; sql; query
- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 4 anos, 5 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
29 de maio de 2020 às 12:05 pm #146045LHCParticipante
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 CODPRDDês de já agradeço os comentários de quem puder me auxiliar.
29 de maio de 2020 às 2:12 pm #146047José Laurindo ChiappaModeradorBlz ? Então, tem *** DIVERSOS *** pontos questionáveis (ou simplesmente errados, ou pelo menos NÃO RECOMENDÁVEIS) aí nessa sua query :
- 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…..
- 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….
- 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….
- 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 !!!!
- 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
29 de maio de 2020 às 4:43 pm #146050LHCParticipanteBrother excelente explicação, deu para entender legal e consegui ajustar em cima do que eu estava precisando.
Obrigado pela ajuda.
Deus te abençoe.
29 de maio de 2020 às 6:37 pm #146051José Laurindo ChiappaModeradorMaravilha – 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.