Usuário com melhor resposta
Consulta média ultimos 4 meses

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