MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


2 participantes

    [Resolvido]Retornar o top 3 de cada cliente e produto por data

    avatar
    flaviosouza37
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3
    Registrado : 11/12/2016

    [Resolvido]Retornar o top 3 de cada cliente e produto por data Empty [Resolvido]Retornar o top 3 de cada cliente e produto por data

    Mensagem  flaviosouza37 11/12/2016, 23:29

    Ola,

    estou com muita dificuldade para criar uma consulta que retorne o top 3 dos produtos que cada cliente comprou por data, seria algo do tipo.

    o cliente 1 comprou o produto 1 nos períodos 2016/11, 2016/10, 2016/09, 2016/08, 2016/07 ...

    a consulta retornaria apenas 2016/11, 2016/10, 2016/09 para esse cliente / produto.

    eu cheguei no seguinte código:

    Código:

    SELECT
       V1.CodSAP_Cliente,
       V1.CodSAP_ItemProduto,
       C1.ANOMES
          
    FROM    VOLUME_ITEM V1
    INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO
    WHERE C1.ANOMES IN
    (
       SELECT distinct top 3
             C.ANOMES
             
       FROM    VOLUME_ITEM V
       INNER JOIN CALENDARIO C ON C.DATA = V.DATA_EMISSAO
       where V1.CodSAP_Cliente = V.CodSAP_Cliente and V1.CodSAP_ItemProduto = V.CodSAP_ItemProduto
       order by C.ANOMES desc
    )
     

    Essa consulta fica rodando e não retorna nada, é extremamente pesada, já tentei gravar os dados da primeira parte da consulta em uma tabela temporária mas mesmo assim não fez a consulta ficar rápida.

    O meu raciocinio é o seguinte: a primeira consulta tem o produto que cada cliente comprou em todos os periodos, dessa consulta eu so retornaria o que esta entre os valores maximos para cara cliente e produto que é a parte do IN da consulta.

    alguem sabe como fazer uma consulta desse tipo no access?
    Jair Martins
    Jair Martins
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 78
    Registrado : 23/03/2016

    [Resolvido]Retornar o top 3 de cada cliente e produto por data Empty Re: [Resolvido]Retornar o top 3 de cada cliente e produto por data

    Mensagem  Jair Martins 12/12/2016, 12:52

    Flavio, tem como mandar as tabelas populadas para que possamos testar e, quem sabe, achar uma solução?

    Abs.
    avatar
    flaviosouza37
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3
    Registrado : 11/12/2016

    [Resolvido]Retornar o top 3 de cada cliente e produto por data Empty Re: [Resolvido]Retornar o top 3 de cada cliente e produto por data

    Mensagem  flaviosouza37 12/12/2016, 20:35

    Jair muito obrigado por se dispor em ajudar, acho que ja encontrei outra solução.

    O que eu fiz foi primeiro achar o max de cada cliente e produto e depois para pegar o segundo maior periodo eu acho o max de novo só que onde o anomes é menor do que o max que já achei anteriormente, a consulta só usa join, é extremamente inviavel para mais do que 3 periodos mas como eu preciso so do top 3 funcionou, segue a consulta caso alguem precise futuramente de algo parecido.

    Código:
    SELECT
    CodSAP_Cliente,
    CodSAP_ItemProduto,
    SUM(Primeiro_Periodo) AS P1,
    SUM(Segundo_periodo)  AS P2,
    SUM(Terceiro_periodo) AS P3
    FROM(
     SELECT
     V1.CodSAP_Cliente,
     V1.CodSAP_ItemProduto,
     Max(C1.ANOMES) as Primeiro_Periodo,
     0 as Segundo_periodo,
     0 as Terceiro_periodo
     
     FROM VOLUME_ITEM V1
     INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO
     group by V1.CodSAP_Cliente, V1.CodSAP_ItemProduto

     UNION ALL

     SELECT
     V1.CodSAP_Cliente,
     V1.CodSAP_ItemProduto,
     0 as Primeiro_Periodo,
     Max(C1.ANOMES) as Segundo_Periodo,
     0 as Terceiro_periodo
     
     FROM ((VOLUME_ITEM V1
     INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO)
     INNER JOIN (
     SELECT
     V1.CodSAP_Cliente,
     V1.CodSAP_ItemProduto,
     Max(C1.ANOMES) as MAX_1
     
     FROM VOLUME_ITEM V1
     INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO
     group by V1.CodSAP_Cliente, V1.CodSAP_ItemProduto
     ) as P2 ON V1.CodSAP_Cliente = p2.CodSAP_Cliente and V1.CodSAP_ItemProduto = p2.CodSAP_ItemProduto
     ) WHERE C1.ANOMES < P2.MAX_1
     GROUP BY V1.CodSAP_Cliente, V1.CodSAP_ItemProduto


     UNION ALL

     SELECT
     V1.CodSAP_Cliente,
     V1.CodSAP_ItemProduto,
     0 as Primeiro_Periodo,
     0 as Segundo_periodo,
     Max(C1.ANOMES) as Terceiro_periodo
     
     FROM ((VOLUME_ITEM V1
     INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO)
     INNER JOIN (

     SELECT
     v1.CodSAP_Cliente,
     V1.CodSAP_ItemProduto,
     Max(C1.ANOMES) as MAX1,
     0 as MAX2
     
     FROM VOLUME_ITEM V1
     INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO
     group by V1.CodSAP_Cliente, V1.CodSAP_ItemProduto

     UNION ALL

     SELECT
     V1.CodSAP_Cliente,
     V1.CodSAP_ItemProduto,
     0 as MAX1,
     Max(C1.ANOMES) as MAX2
     
     FROM ((VOLUME_ITEM V1
     INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO)
     INNER JOIN (
     SELECT
     V1.CodSAP_Cliente,
     V1.CodSAP_ItemProduto,
     Max(C1.ANOMES) as MAX_1
     
     FROM VOLUME_ITEM V1
     INNER JOIN CALENDARIO C1 ON C1.DATA = V1.DATA_EMISSAO
     group by V1.CodSAP_Cliente, V1.CodSAP_ItemProduto
     ) as P2 ON V1.CodSAP_Cliente = p2.CodSAP_Cliente and V1.CodSAP_ItemProduto = p2.CodSAP_ItemProduto
     ) WHERE C1.ANOMES < P2.MAX_1
     GROUP BY V1.CodSAP_Cliente, V1.CodSAP_ItemProduto)AS P3
     ON V1.CodSAP_Cliente = p3.CodSAP_Cliente and V1.CodSAP_ItemProduto = p3.CodSAP_ItemProduto)
     WHERE C1.ANOMES < P3.MAX2
     group by V1.CodSAP_Cliente, V1.CodSAP_ItemProduto
    )
    GROUP BY CodSAP_Cliente, CodSAP_ItemProduto

    Conteúdo patrocinado


    [Resolvido]Retornar o top 3 de cada cliente e produto por data Empty Re: [Resolvido]Retornar o top 3 de cada cliente e produto por data

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 22/11/2024, 06:59