none
Duvida no PIVOT table SQL 2000 RRS feed

  • Pergunta

  • Ae pessoal td bem?
    Estou com um problema e se alguem pudesse ajudar eu agradeço.
    Preciso fazer um pivot table no sql 2000 e estou com dificuldades.

    O cenario é o seguinte:


     mes     tipo    total
     9          A     138040
     9          B     53046
     9          C     11612
     9          D     37292
     9          E     7850
     10        A     119015
     10        B     14403
     10        C     36002
     10        D     7870
     10        E      38615

    preciso fazer assim:

    tipo mes9   mes10
         
    A    138040 119015
    B    53046  14403
    C    11612  36002
    D    37292  7870
    E    7850   38615

    Alguem tem alguma solução??
    Obrigado !

    quinta-feira, 18 de março de 2010 14:26

Respostas

  • segue script

    use tempdb
    go
    
    -- tabela temporária
    create table #t (Mes tinyint, Tipo char(1), Total int)
    
    -- populando tabela
    insert into #t  select  9,  'A', 138040
    insert into #t  select  9,  'B', 53046
    insert into #t  select  9,  'C', 11612
    insert into #t  select  9,  'D', 37292
    insert into #t  select  9,  'E', 7850
    insert into #t  select  10, 'A', 119015
    insert into #t  select  10, 'B', 14403
    insert into #t  select  10, 'C', 36002
    insert into #t  select  10, 'D', 7870
    insert into #t  select  10, 'E', 38615
    
    ---------------------------------
    -- simulando pivot em sql 2000 --
    ---------------------------------
    
    -- declaro duas variáves, uma p/ montar as colunas e outra p/ executar o select.
    DECLARE @SQl varchar(4000), 
            @Col varchar(4000)
    
    -- Verifico quais são os meses q serão utilizado no pivot
    SELECT 
        @Col = ISNULL(@Col+',','') 
        + 'Mes'+ CAST(Mes AS VARCHAR(2)) 
        + ' = max(case mes when ' 
        + CAST(Mes AS VARCHAR(2)) 
        + ' then Total end)'
    FROM 
        #t 
    group by
        mes    
    
    
    -- monto a instrução final
    SET @SQl = ' select Tipo, ' + @Col
    SET @SQl = @SQl + ' from #t group by tipo'
    
    -- executo o pivot dinâmico
    exec (@SQl)
    
    
    -- drop a tabela temporária
    drop table #T

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Marques Junior quinta-feira, 18 de março de 2010 16:06
    • Marcado como Resposta Heloisa Pires sexta-feira, 13 de abril de 2012 17:54
    quinta-feira, 18 de março de 2010 15:25
  • Funcionou perfeito aqui !
    Valeu mesmo Marcelino !

    O pulo do gato, foi na logica de concatenar a coluna.. ali é o alicerce do funcionamento..
    Qualquer duvida eu volto a postar novamente,

    Obrigado e um abraço !
    • Marcado como Resposta Edilsonljr quinta-feira, 18 de março de 2010 16:55
    quinta-feira, 18 de março de 2010 16:54

Todas as Respostas

  • Bom dia Edilson, segue exemplo de como fazer:

    -- tabela temporária
    declare @t table (mes tinyint, Tipo char(1), Total int)
    
    -- populando tabela
    insert into @t  select  9, 'A', 138040
    insert into @t  select  9, 'B', 53046
    insert into @t  select  9, 'C', 11612
    insert into @t  select  9, 'D', 37292
    insert into @t  select  9, 'E', 7850
    insert into @t  select  10, 'A', 119015
    insert into @t  select  10, 'B', 14403
    insert into @t  select  10, 'C', 36002
    insert into @t  select  10, 'D', 7870
    insert into @t  select  10, 'E', 38615
    
    -- simulando pivot em sql 2000
    select 
        Tipo, 
        Mes09 = max(case mes when 9 then Total end),
        Mes10 = max(case mes when 10 then Total end)
    from
        @t    
    group by
        tipo

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    quinta-feira, 18 de março de 2010 14:40

  • Marcelino, e quando não se sabe o números de campos, Mes1, Mes2...?
    quinta-feira, 18 de março de 2010 14:43
  • ai vc terá q fazer um pivot dinâmico, irei montar aqui e já posto.
    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    quinta-feira, 18 de março de 2010 15:05
  • segue script

    use tempdb
    go
    
    -- tabela temporária
    create table #t (Mes tinyint, Tipo char(1), Total int)
    
    -- populando tabela
    insert into #t  select  9,  'A', 138040
    insert into #t  select  9,  'B', 53046
    insert into #t  select  9,  'C', 11612
    insert into #t  select  9,  'D', 37292
    insert into #t  select  9,  'E', 7850
    insert into #t  select  10, 'A', 119015
    insert into #t  select  10, 'B', 14403
    insert into #t  select  10, 'C', 36002
    insert into #t  select  10, 'D', 7870
    insert into #t  select  10, 'E', 38615
    
    ---------------------------------
    -- simulando pivot em sql 2000 --
    ---------------------------------
    
    -- declaro duas variáves, uma p/ montar as colunas e outra p/ executar o select.
    DECLARE @SQl varchar(4000), 
            @Col varchar(4000)
    
    -- Verifico quais são os meses q serão utilizado no pivot
    SELECT 
        @Col = ISNULL(@Col+',','') 
        + 'Mes'+ CAST(Mes AS VARCHAR(2)) 
        + ' = max(case mes when ' 
        + CAST(Mes AS VARCHAR(2)) 
        + ' then Total end)'
    FROM 
        #t 
    group by
        mes    
    
    
    -- monto a instrução final
    SET @SQl = ' select Tipo, ' + @Col
    SET @SQl = @SQl + ' from #t group by tipo'
    
    -- executo o pivot dinâmico
    exec (@SQl)
    
    
    -- drop a tabela temporária
    drop table #T

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Marques Junior quinta-feira, 18 de março de 2010 16:06
    • Marcado como Resposta Heloisa Pires sexta-feira, 13 de abril de 2012 17:54
    quinta-feira, 18 de março de 2010 15:25
  • Boa, valeu Marcelino.
    quinta-feira, 18 de março de 2010 16:15
  • Otima resposta Marcelino !
    Estou fazendo uns testes e ja respondo
    Abraço e obrigado !
    quinta-feira, 18 de março de 2010 16:31
  • Funcionou perfeito aqui !
    Valeu mesmo Marcelino !

    O pulo do gato, foi na logica de concatenar a coluna.. ali é o alicerce do funcionamento..
    Qualquer duvida eu volto a postar novamente,

    Obrigado e um abraço !
    • Marcado como Resposta Edilsonljr quinta-feira, 18 de março de 2010 16:55
    quinta-feira, 18 de março de 2010 16:54
  • Edilson, valeu pelo retorno.
    Depois não esqueça de classificar como resposta as thread q lhe auxiliaram a solucionar sua dúvida.

    pois assim outros tb poderam se beneficiar deste conteúdo.
    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    quinta-feira, 18 de março de 2010 18:33
  • Só mais uma dúvida.

    Existe alguma possibilidade de inserir dinamicamente os nomes das colunas assim: mes/ano  ??

    Exemplo eu tenho de março a maio, as colunas tem que ser mostradas assim:  03/2009 | 04/2009 | 05/2009  ??

    Abraço


    Edilson Lima - MCP WINXP Professional
    terça-feira, 23 de março de 2010 12:53
  • Marcelino, baseado nesse cenario anterior, como seria possivel fazer um subtotal nessa situação dinamicamente?

    >Se precisar abro outro post, mencionei aqui pois o cenario é igual ao acima.

     

    Grato,

    Edilson


    Edilson Lima - MCP WINXP Professional
    quarta-feira, 31 de março de 2010 15:59