GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Home Fóruns SQL e PL/SQL Buscar maior data

Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #153841
    SQL Noob
    Participante

    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”

     

     

    #153842

    Blz ? 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

    #153873
    Motta
    Participante

    Veja se isto ajuda.

    https://pt.stackoverflow.com/questions/488272/como-fazer-um-select-pra-pegar-o-valor-da-%C3%BAltima-data-cadastrada

    Basicamente , para cada chave busca a maior data , mas a resposta precisa passa por conhecer minimamente o modelo.

    #153876

    Sim, 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

    #153893
    Motta
    Participante

    Chiappa , 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.

     

     

    #153894

    Verdade, 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

    #153902
    Motta
    Participante

    Certa  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 !

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