Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #153841
    Avatar de SQL NoobSQL 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
      Avatar photoJosé Laurindo Chiappa
      Moderador

        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
        Avatar de MottaMotta
        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
          Avatar photoJosé Laurindo Chiappa
          Moderador

            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
            Avatar de MottaMotta
            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
              Avatar photoJosé Laurindo Chiappa
              Moderador

                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
                Avatar de MottaMotta
                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.
                plugins premium WordPress