- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 2 anos, 8 meses atrás por Motta.
-
AutorPosts
-
15 de março de 2022 às 2:30 pm #153841SQL NoobParticipante
Boa tarde pessoal!
Sou novato em SQL, tenho a seguinte consulta que busca a ultima venda na tabela vendas entre duas unidades da nossa empresa (200 e 201), agora preciso incluir mais uma na busca (202), como posso fazer isso?, abaixo o pedaço da consulta que mencionei:
,(case
when
(select t2.PROD_DTULVEN_1
from estprod t2
where t2.prod_empresa_1 = ‘200’ and t.prod_codprod_1 = t2.prod_codprod_1)=
(select t4.PROD_DTULVEN_1
from estprod t4
where t4.prod_empresa_1 = ‘201’ and t.prod_codprod_1 = t4.prod_codprod_1)
then
(select t2.PROD_DTULVEN_1
from estprod t2
where t2.prod_empresa_1 = ‘200’ and t.prod_codprod_1 = t2.prod_codprod_1)
else
(select t4.PROD_DTULVEN_1
from estprod t4
where t4.prod_empresa_1 = ‘201’ and t.prod_codprod_1 = t4.prod_codprod_1) end) as “Ult. Venda”15 de março de 2022 às 6:19 pm #153842José Laurindo ChiappaModeradorBlz ? Então, sem ver o código COMPLETO e (principalmente) sem saber EXATAMENTE o relacionamento entre as duas tabelas fica difícil de entender, mas o que salta aos olhos é esse Absrudo procedimento de vc abrir 3 sub-queries diferentes para encontrar os dados das empresas : isso Absolutamente não faz sentido, se vc tivesse 10 empresas ia abrir 10 sub-queries ?? A performance disso VAI ser abismalmente ruim….
SUPONDO que o relacionamento entra as tabelas de VENDAS e de ESTPROD seja essas colunas PROD_CODPROD_1 presente nas duas E vc quer trazer na tabela de VENDAS apenas as vendas para Enpresas 200, 201 e 202 , o procedimento mais indicado seria :
SElECT ……, B.PROD_DTULVEN_1
FROM VENDAS A
JOIN ESTPROD B ON B.PROD_CODPROD_1 = A.PROD_CODPROD_1
WHERE B.prod_empresa_1 IN (‘200’, ‘201’, ‘202’)
…Sim ??? Claro, vc DEVE ter mais regras de negócio que quer implementar mas o caminho Correto é esse, e não ficar fazendo Vários e Vários acessos na mesma tabela , isso é sem sentido…
Abraços,
Chiappa
16 de março de 2022 às 10:19 pm #153873MottaParticipanteVeja se isto ajuda.
Basicamente , para cada chave busca a maior data , mas a resposta precisa passa por conhecer minimamente o modelo.
17 de março de 2022 às 8:56 am #153876José Laurindo ChiappaModeradorSim, a obs sobre a necessidade de mínimo conhecimento sobre o modelo não podia estar MAIS correta, é EXATAMENTE ISSO…
Porém, já que estamos falando sobre SGBD Oracle, onde nós Possuímos o utilissímo Recurso de Funções Analíticas , de modo geral eu Discordo da solução usada nesse exemplo indicado, de fazer SUB-QUERY tipo :
WHERE … AND coluna = (select max(coluna) from mesmatabela)
para encontrar o maior valor : isso VAI FORÇAR o Oracle a fazer Múltiplos Acessos na mesma tabela, DIFICILMENTE UMA BOA COISA para performance , eu RECOMENDARIA FORTEMENTE o uso da função analítica MAX com OVER(PARTITION BY colunachave)….
Fica a Sugestão lá pro colega que perguntou….
Abraços,
Chiappa
17 de março de 2022 às 9:23 pm #153893MottaParticipanteChiappa , vou fazer uns testes com as duas opções , achei legal a dica , realmente quase sempre faço o “max” em casos deste tipo , em geral quando se quer mais dados , tipo liste valor , data , loja etc da última compra de cada cliente.
Funções Analiticas quebram um senhor galho …
Abraço.
18 de março de 2022 às 7:58 am #153894José Laurindo ChiappaModeradorVerdade, né ? Teve um Autor que certa vez disse que Funções Analíticas são a coisa mais útil inventada na linguagem SQL depois do SELECT, e (descontando, claro, a hipérbole bombástica) eu concordo, Funções Analíticas são uma Solução em busca de problemas….
Abraços,
José Laurindo Chiappa
18 de março de 2022 às 7:13 pm #153902MottaParticipanteCerta vez precisei de um relatório com “running total” que zerasse a cada 12 meses , intervalo inicial qq mês , achei que a solução seria tabela temporária eis que uma linha de AF resolveu.
“Solução em busca de problemas”….
Vou usar isto !
-
AutorPosts
- Você deve fazer login para responder a este tópico.