none
Calcular Custo máximo de venda por mês RRS feed

  • Pergunta

  • Bom Dia Amigos.

    Tenho uma rotina para realizar que parece ser simples mas não estou conseguindo finalizar.

    O problema é o seguinte, um determinado produto e vendido durante o mês e eu tenho que pegar qual foi seu maior custo e repetir ate terminar o mês, no proximo mês inicia com o ultimo custo mas depois da primeira venda tenho que verificar qual o custo atual do mes. confuso? vou dar um exemplo abaixo.

    Neste exemplo peguei venda de um produto durante 3 meses.

    No primeiro mês o maior custo foi 1,05

    No segundo mês o maior custo foi 1,05

    No Terceiro mês o maior custo foi 0,91

    Tenho que mostrar o maior custo por mês e o maior do periodo.


                   DATA                            VALOR     CUSTO

    1 01/01/2012 1   0,70
    2 10/01/2012 1,3   0,91
    3 14/01/2012 1,1   0,91
    4 18/01/2012 1,5   1,05
    5 20/01/2012 1   1,05
    6 29/01/2012 1,2   1,05
    7 01/02/2012 1   1,05
    8 01/02/2012 1,2   0,84
    9 10/02/2012 1,1   0,84
    10 12/02/2012 1,3   0,91
    11 26/02/2012 1,2   0,91
    12 28/02/2012 1,3   0,91
    13 01/03/2012 1,1   0,91
    14 05/03/2012 1,2   0,84
    15 10/03/2012 1,1   0,84
    16 25/03/2012 1,2   0,84
    17 27/03/2012 1,3   0,91
    18 30/03/2012 1,2   0,91

    Obrigado.

    Sandro Galdino


    sábado, 10 de novembro de 2012 14:10

Respostas

  • Experimente:

    with 
        CTE_C as
        (
            select 
                DATEADD(DAY, DATEPART(DAY, DATA) * -1 + 1, DATA) as MesAno, 
                Data,
                VALOR,
                VALOR * 0.7 AS Custo,
                ROW_NUMBER() OVER(PARTITION BY DATEADD(DAY, DATEPART(DAY, DATA) * -1 + 1, DATA) 
                                  Order by Data) as RowNum
            FROM Tabela
        ),
        
        CTE_M as
        (
            select 
                MesAno,
                MAX(Custo) as Custo
            from CTE_C
            group by MesAno
        ),
        
        CTE_F as
        (
            select 
                c.MesAno,
                c.DATA,
                c.VALOR,
                case when c.RowNum = 1 and m.Custo > c.Custo
                    then m.Custo
                    else c.Custo
                end as Custo,
                c.RowNum
            from CTE_C as c
            left join CTE_M as m on m.MesAno = DATEADD(MONTH, -1, c.MesAno)
        )
    
    select MesAno, Data, MAX(Valor) as Valor, MAX(custo) as Custo, RowNum
    from CTE_F 
    group by grouping sets((MesAno, Data, RowNum), (MesAno), ())

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 12 de novembro de 2012 18:56

Todas as Respostas

  • Boa noite,

    Não sei se entendi corretamente a questão, mas experimente desta forma:

    with 
        CTE_M as
        (
            select 
                DATEADD(DAY, DATEPART(DAY, DATA) * -1 + 1, DATA) as MesAno,
                MAX(CUSTO) AS CUSTO
            from Tabela
            group by
                DATEADD(DAY, DATEPART(DAY, DATA) * -1 + 1, DATA)
        ),
        
        CTE_T as
        (
            select
                m.MesAno,
                case when m.CUSTO > a.CUSTO or a.CUSTO is null 
                    then m.CUSTO else a.CUSTO 
                end as CUSTO
            from CTE_M as m
            left join CTE_M as a on a.MesAno = DATEADD(MONTH, -1, m.MesAno)
        )
    
    select 
        MesAno,
        MAX(CUSTO) as CUSTO 
    from CTE_T
    GROUP BY GROUPING SETS((MesAno), ())

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    sábado, 10 de novembro de 2012 21:32
  • Obrigado vou olhar, assim que tiver a solução retorno.

    domingo, 11 de novembro de 2012 22:29
  • Bom Dia Amigos.

    Tenho uma rotina para realizar que parece ser simples mas não estou conseguindo finalizar.

    O problema é o seguinte, um determinado produto e vendido durante o mês e eu tenho que pegar qual foi seu maior custo e repetir ate terminar o mês, no proximo mês inicia com o ultimo custo mas depois da primeira venda tenho que verificar qual o custo atual do mes. confuso? vou dar um exemplo abaixo.

    Neste exemplo peguei venda de um produto durante 3 meses.

    No primeiro mês o maior custo foi 1,05

    No segundo mês o maior custo foi 1,05

    No Terceiro mês o maior custo foi 0,91

    Tenho que mostrar o maior custo por mês e o maior do periodo.


                   DATA                            VALOR     CUSTO

    1 01/01/2012 1   0,70
    2 10/01/2012 1,3   0,91
    3 14/01/2012 1,1   0,91
    4 18/01/2012 1,5   1,05
    5 20/01/2012 1   1,05
    6 29/01/2012 1,2   1,05
    7 01/02/2012 1   1,05
    8 01/02/2012 1,2   0,84
    9 10/02/2012 1,1   0,84
    10 12/02/2012 1,3   0,91
    11 26/02/2012 1,2   0,91
    12 28/02/2012 1,3   0,91
    13 01/03/2012 1,1   0,91
    14 05/03/2012 1,2   0,84
    15 10/03/2012 1,1   0,84
    16 25/03/2012 1,2   0,84
    17 27/03/2012 1,3   0,91
    18 30/03/2012 1,2   0,91

    Obrigado.

    Sandro Galdino


    Acho que cometi uma falha na explicação, a coluna CUSTO coloquei no exemplo para informar como fica o calculo depois de aplicar o metodo mas ela não existe no banco. Para achar o custo é feito uma conta pegando  70% do valor de venda mas se o custo atual de venda for menor que o anterior mantem o maior custo do mês. O primeiro custo do mês sempre será o ultimo custo do mes anterior.

    Obrigado galera

    domingo, 11 de novembro de 2012 23:06
  • Neste exemplo peguei venda de um produto durante 3 meses.

    No primeiro mês o maior custo foi 1,05

    No segundo mês o maior custo foi 1,05

    No Terceiro mês o maior custo foi 0,91

    Tenho que mostrar o maior custo por mês e o maior do periodo.

    Fiquei na dúvida... você quer somente o maior custo de cada mes ou o custo dia por dia?


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 12 de novembro de 2012 12:35
  • Boa Tarde!

    Quero o Custo Dia a Dia  e o maior por mês.


    CODIGO  | DATA          |      VALOR          |         CUSTO 'esta coluna não existe na tabela serve de gabarito final'

    1      01/01/2012 1                  0,70
    2 10/01/2012 1,3   0,91
    3 14/01/2012 1,1   0,91
    4 18/01/2012 1,5   1,05
    5 20/01/2012 1   1,05
    6 29/01/2012 1,2   1,05
    7 01/02/2012 1   1,05
    8 01/02/2012 1,2   0,84
    9 10/02/2012 1,1   0,84
    10 12/02/2012 1,3   0,91
    11 26/02/2012 1,2   0,91
    12 28/02/2012 1,3   0,91
    13 01/03/2012 1,1   0,91
    14 05/03/2012 1,2   0,84
    15 10/03/2012 1,1   0,84
    16 25/03/2012 1,2   0,84
    17 27/03/2012 1,3   0,91
    18 30/03/2012 1,2   0,91

    segunda-feira, 12 de novembro de 2012 15:47
  • Boa tarde,

    As linhas 7 e 13 da amostra acima existem na tabela?

    Existem 2 linhas para o dia 01/02/2012?


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 12 de novembro de 2012 17:39
  • Existe sim, seria vendas diferentes.

    Obrigado ai pela força.

    segunda-feira, 12 de novembro de 2012 18:14
  • Experimente:

    with 
        CTE_C as
        (
            select 
                DATEADD(DAY, DATEPART(DAY, DATA) * -1 + 1, DATA) as MesAno, 
                Data,
                VALOR,
                VALOR * 0.7 AS Custo,
                ROW_NUMBER() OVER(PARTITION BY DATEADD(DAY, DATEPART(DAY, DATA) * -1 + 1, DATA) 
                                  Order by Data) as RowNum
            FROM Tabela
        ),
        
        CTE_M as
        (
            select 
                MesAno,
                MAX(Custo) as Custo
            from CTE_C
            group by MesAno
        ),
        
        CTE_F as
        (
            select 
                c.MesAno,
                c.DATA,
                c.VALOR,
                case when c.RowNum = 1 and m.Custo > c.Custo
                    then m.Custo
                    else c.Custo
                end as Custo,
                c.RowNum
            from CTE_C as c
            left join CTE_M as m on m.MesAno = DATEADD(MONTH, -1, c.MesAno)
        )
    
    select MesAno, Data, MAX(Valor) as Valor, MAX(custo) as Custo, RowNum
    from CTE_F 
    group by grouping sets((MesAno, Data, RowNum), (MesAno), ())

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 12 de novembro de 2012 18:56