Usuário com melhor resposta
Pivot dinâmico

Pergunta
-
Boa tarde,
Tenho a seguinte consulta :
SELECT * FROM BASE_RREIP WHERE dt_hr_fecom BETWEEN DATEADD(MONTH, -12,GETDATE()) AND DATEADD(MONTH,1, GETDATE())
E desejo montar uma consulta PIVOT da seguinte forma, baseada na consulta acima:
Pesquisando e com ajuda de algumas pessoas consegui gerar o código abaixo e que me resultou :
declare @colunas_pivot as nvarchar(max), @comando_sql as nvarchar(max) set @colunas_pivot = stuff(( select distinct ',' + quotename(month(dt_hr_fecom)) from TOP_ANO for xml path('') ), 1, 1, '') print @colunas_pivot set @comando_sql = ' select * from ( select month(dt_hr_fecom) as mes, designacao_circuito, COUNT(NUM_REC) as Valor from TOP_ANO group by designacao_circuito, month(dt_hr_fecom) ) em_linha pivot (sum(valor) for mes in (' + @colunas_pivot + ')) em_colunas order by 1' execute(@comando_sql) go
O que eu preciso é que no nome das colunas (meses) venha acompanho do ano(ex.: 03/2018 e 03/2019) e se possível ordenado.
Respostas
Todas as Respostas
-
-
Obrigado José,
Confesso que para os meus conhecimentos, achei de difícil implementação, esqueci de mencionar, precisaria de uma VIEW ou até mesmo uma PROCEDURE (posteriormente eu iria fazer com que ela criasse uma tabela com os resultados), veja o resultado do código que vc passou:
Ainda tentando ajustar o comando que postei:
declare @colunas_pivot as nvarchar(max), @comando_sql as nvarchar(max) set @colunas_pivot = stuff(( select distinct ',' + convert(varchar,concat(month(dt_hr_fecom),year(dt_hr_fecom))) from TOP_ANO for xml path('') ), 1, 1, '') print @colunas_pivot set @comando_sql = ' select * from ( select convert(varchar,concat(month(dt_hr_fecom),year(dt_hr_fecom))) as mes, designacao_circuito, COUNT(NUM_REC) as Valor from TOP_ANO group by designacao_circuito, convert(varchar,concat(month(dt_hr_fecom),year(dt_hr_fecom))) ) em_linha pivot (count(valor) for mes in (' + @colunas_pivot + ')) em_colunas order by 1' execute(@comando_sql) go
me resultou :
-
-
Após executar o código #1, observe na aba Mensagens o comando SQL que foi montado. Poderia copiá-lo e transcrevê-lo para este tópico?
SELECT P.designacao_circuito, max (case when I = 1 then P.Valor else 0 end) as [Março/2018], max (case when I = 2 then P.Valor else 0 end) as [Abril/2018], max (case when I = 3 then P.Valor else 0 end) as [Maio/2018], max (case when I = 4 then P.Valor else 0 end) as [Junho/2018], max (case when I = 5 then P.Valor else 0 end) as [Julho/2018], max (case when I = 6 then P.Valor else 0 end) as [Agosto/2018], max (case when I = 7 then P.Valor else 0 end) as [Setembro/2018], max (case when I = 8 then P.Valor else 0 end) as [Outubro/2018], max (case when I = 9 then P.Valor else 0 end) as [Novembro/2018], max (case when I = 10 then P.Valor else 0 end) as [Dezembro/2018], max (case when I = 11 then P.Valor else 0 end) as [Janeiro/2019], max (case when I = 12 then P.Valor else 0 end) as [Fevereiro/2019], max (case when I = 13 then P.Valor else 0 end) as [Março/2019], sum (P.Valor) as Total from #Passo1 as P group by P.designacao_circuito;
- Editado Edvaldo A quinta-feira, 14 de março de 2019 19:02 .
-
-