none
Pivot dinâmico RRS feed

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


    quinta-feira, 14 de março de 2019 17:02

Respostas

Todas as Respostas

  • Deleted
    • Marcado como Resposta Edvaldo A quinta-feira, 14 de março de 2019 19:41
    quinta-feira, 14 de março de 2019 17:46
  • 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 :

    quinta-feira, 14 de março de 2019 18:04
  • Deleted
    quinta-feira, 14 de março de 2019 18:34

  • 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 .
    quinta-feira, 14 de março de 2019 19:00
  • Deleted
    quinta-feira, 14 de março de 2019 19:11
  • Ainda estou avaliando para compreender melhor.

    As respeito dos valores, estão corretos sim, no print por coincidência tiveram apenas 1 no total mesmo.

    quinta-feira, 14 de março de 2019 19:25