none
Consulta média ultimos 4 meses RRS feed

  • Pergunta

  • Bom dia.

    A tabela possui a seguinte estrutura:

    B3_Q01 B3_Q02 B3_Q03 B3_Q04 B3_Q05 B3_Q06 B3_Q07 B3_Q08 B3_Q09 B3_Q10 B3_Q11 B3_Q12
    571 751 806 524 588 701 732 728 588 551 977 618
    3283 2957 3315 2373 2220 3710 2822 3398 2681 2173 3176 1921
    2597 1621 2849 2366 1722 2711 2111 2955 1807 1559 2304 1167


    Sendo B3_Q01(JANEIRO), B3_Q02(FEVEREIRO)... Preciso da média somente dos últimos 4 meses para cada linha, alguém pode me ajudar?



    segunda-feira, 1 de outubro de 2018 13:25

Respostas

  • Higor, experimente fazer uns testes dessa forma:

    with 
        CTE_Rec as
        (
            select 
                1 as Sequencia, 
                dateadd(month, datediff(month, 0, current_timestamp), 0) as Data
    
            union all
            
            select 
                Sequencia + 1,
                dateadd(month, -1, Data) 
            from CTE_Rec
            where
                Sequencia < 4   
        ),
        
        CTE_Meses as
        (
            select
                month(Data) as Mes
            from CTE_REc
        ),
        
        CTE_Unpivot as
        (
            select B3_COD, Mes, Valor
            from 
            (
                select 
                    B3_COD, 
                    B3_Q01 as [1],
                    B3_Q02 as [2],
                    B3_Q03 as [3],
                    B3_Q04 as [4],
                    B3_Q05 as [5],
                    B3_Q06 as [6],
                    B3_Q07 as [7],
                    B3_Q08 as [8],
                    B3_Q09 as [9],
                    B3_Q10 as [10],
                    B3_Q11 as [11],
                    B3_Q12 as [12]
                from Tabela
            ) as t
            unpivot
            (
                Valor for Mes in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
            ) as u
        )
        
    select
        u.B3_COD,
        avg(u.Valor) as Media
    from CTE_Unpivot as u
    inner join CTE_Meses as m
        on m.Mes = u.Mes
    group by
        u.B3_COD

    Espero que ajude


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

    • Marcado como Resposta Higor Luiz quarta-feira, 3 de outubro de 2018 11:47
    segunda-feira, 1 de outubro de 2018 21:35

Todas as Respostas

  • Bom dia,

    Existe alguma coluna nessa tabela para identificar as linhas?

    E como é identificado o ano? Como teria que ser feita a média se estivéssemos por exemplo em fevereiro?


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

    segunda-feira, 1 de outubro de 2018 15:11
  • Existe o B3_COD para identificar a linha, o ano não é identificado, por exemplo, estamos em outubro de 2018, então o B3_Q11 e B3_Q12 ainda se trata de novembro e dezembro de 2017.

    Se estivermos por exemplo em fevereiro, deve ser considerada a média das colunas B3_Q11, B3_Q12, B3_Q01, B3_Q02.

    segunda-feira, 1 de outubro de 2018 15:18
  • Aqui está um caminho que voce pode seguir, o problema é que não tem a identificação do ano.

    declare @meses table (
    B3_Q01 int,
    B3_Q02 int,
    B3_Q03 int,
    B3_Q04 int,
    B3_Q05 int,
    B3_Q06 int,
    B3_Q07 int,
    B3_Q08 int,
    B3_Q09 int,
    B3_Q10 int,
    B3_Q11 int,
    B3_Q12 int
    )
    
    insert into @meses values
    (571,751,806,524	,588	,701	,732	,728	,588	,551	,977	,618),
    (3283,	2957	,3315	,2373	,2220	,3710	,2822	,3398	,2681	,2173	,3176	,1921),
    (2597,	1621	,2849	,2366	,1722	,2711	,2111	,2955	,1807	,1559	,2304	,1167)
    
    
    
    select 	 
    	*,
    	row_number() over(order by (select null)) as rn
    from (select * from @meses ) p
    unpivot (valores for m in (B3_Q01,B3_Q02,B3_Q03,B3_Q04,B3_Q05,B3_Q06,
    B3_Q07,B3_Q08,B3_Q09,B3_Q10,B3_Q11,B3_Q12) ) as unptv
    
    
    


    Fabiano Carvalho

    segunda-feira, 1 de outubro de 2018 16:42
  • Higor, experimente fazer uns testes dessa forma:

    with 
        CTE_Rec as
        (
            select 
                1 as Sequencia, 
                dateadd(month, datediff(month, 0, current_timestamp), 0) as Data
    
            union all
            
            select 
                Sequencia + 1,
                dateadd(month, -1, Data) 
            from CTE_Rec
            where
                Sequencia < 4   
        ),
        
        CTE_Meses as
        (
            select
                month(Data) as Mes
            from CTE_REc
        ),
        
        CTE_Unpivot as
        (
            select B3_COD, Mes, Valor
            from 
            (
                select 
                    B3_COD, 
                    B3_Q01 as [1],
                    B3_Q02 as [2],
                    B3_Q03 as [3],
                    B3_Q04 as [4],
                    B3_Q05 as [5],
                    B3_Q06 as [6],
                    B3_Q07 as [7],
                    B3_Q08 as [8],
                    B3_Q09 as [9],
                    B3_Q10 as [10],
                    B3_Q11 as [11],
                    B3_Q12 as [12]
                from Tabela
            ) as t
            unpivot
            (
                Valor for Mes in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
            ) as u
        )
        
    select
        u.B3_COD,
        avg(u.Valor) as Media
    from CTE_Unpivot as u
    inner join CTE_Meses as m
        on m.Mes = u.Mes
    group by
        u.B3_COD

    Espero que ajude


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

    • Marcado como Resposta Higor Luiz quarta-feira, 3 de outubro de 2018 11:47
    segunda-feira, 1 de outubro de 2018 21:35
  • Muito obrigado @gabimex e @Faabiianooc ! As ajudas foram muito úteis, consegui aqui.
    quarta-feira, 3 de outubro de 2018 11:47