none
consulta totalizando por mes RRS feed

  • Pergunta

  • Como faço uma consulta que retorne os dados totalizando pelo mês. Exemplo, tenho duas tabelas relacionadas, clientes e vendas, gostaria de totalizar, mensalmente, as vendas de cada cliente, em determinado ano.

    Cliente                                   Janeiro | Fevereiro | Março | Abril | Maio | Junho | Julho | Agosto | Setembro | Outubro | Novembro | Dezembro |

    Maria                                              0 |            2 |        1 |      4 |      6 |       0 |       2 |        3 |             5 |           0 |              9 |              4 |

    João                                                1 |           1 |        0 |       0 |     0 |       3 |       1 |        5 |              6 |           7 |             8 |             10 |

    Grato pela atenção;

    terça-feira, 11 de dezembro de 2012 09:17

Respostas

  • Bom dia Edson,

    Esta situação pode ser solucionada com o uso do PIVOT (Sql server > 2005). Veja:

    http://msdn.microsoft.com/pt-br/library/ms177410(v=sql.105).aspx
    http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx
    http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/

    At.
    Rafael

    • Marcado como Resposta Edson BH terça-feira, 11 de dezembro de 2012 16:24
    terça-feira, 11 de dezembro de 2012 10:22
  • Edson, como o Rafael disse, tente utilizar uma pivot, ex:

    create table #teste(Cliente nvarchar(10), Mes nvarchar(10), Vendas float)
    
    insert into #teste values ('Cliente01', 'JAN', 100)
    insert into #teste values ('Cliente02', 'JAN', 300)
    insert into #teste values ('Cliente03', 'JAN', 400)
    insert into #teste values ('Cliente01', 'FEV', 100)
    insert into #teste values ('Cliente02', 'FEV', 500)
    insert into #teste values ('Cliente03', 'FEV', 100)
    insert into #teste values ('Cliente01', 'MAR', 600)
    insert into #teste values ('Cliente02', 'MAR', 300)
    insert into #teste values ('Cliente03', 'MAR', 800)
    insert into #teste values ('Cliente01', 'ABR', 100)
    insert into #teste values ('Cliente02', 'ABR', 900)
    insert into #teste values ('Cliente03', 'ABR', 100)
    
    
    select * from #teste
    pivot (sum (Vendas) for MES in 
    (JAN,FEV,MAR,ABR,MAI,JUN,JUL,AGO,[SET],OUT,NOV,DEC)) as VENDAS
    


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 11 de dezembro de 2012 13:10
  • Segue outra sugestão q adaptei de um post meu recente. 

    -- tabela temporária
    declare @tb as table (Cliente varchar(10), Valor smallint, Data date)
    
    --Populando tabela
    insert into @tb (Cliente,valor,data) 
    values
    ('Maria',1, '2012-01-10'),
    ('João' ,2, '2012-01-11'),
    ('João' ,2, '2012-01-21'),
    ('João' ,2, '2012-03-29'),
    ('Maria',1, '2012-03-10'),
    ('Maria',1, '2012-05-10'),
    ('Maria',1, '2012-06-10'),
    ('Maria',1, '2012-07-10'),
    ('João' ,3, '2012-08-10')
    
    --usando a função Pivot
    SELECT * FROM 
    (
        select Cliente, Valor, 
          CASE month(data)   
            WHEN  1 THEN 'jan' WHEN  2 THEN 'fev' 
            WHEN  3 THEN 'mar' WHEN  4 THEN 'abr' 
            WHEN  5 THEN 'mai' WHEN  6 THEN 'jun' 
            WHEN  7 THEN 'jul' WHEN  8 THEN 'ago' 
            WHEN  9 THEN 'set' WHEN 10 THEN 'out' 
            WHEN 11 THEN 'nov' WHEN 12 THEN 'dez' 
        END AS Mes
        FROM @tb 
    ) as x    
    PIVOT (
            SUM(valor) FOR Mes in ([jan], [fev], [mar], [abr], [mai], [jun], [jul], [ago], [set], [out], [nov], [dez])
           ) as pv


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Edson BH terça-feira, 11 de dezembro de 2012 16:24
    terça-feira, 11 de dezembro de 2012 16:06

Todas as Respostas

  • Bom dia Edson,

    Esta situação pode ser solucionada com o uso do PIVOT (Sql server > 2005). Veja:

    http://msdn.microsoft.com/pt-br/library/ms177410(v=sql.105).aspx
    http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx
    http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/

    At.
    Rafael

    • Marcado como Resposta Edson BH terça-feira, 11 de dezembro de 2012 16:24
    terça-feira, 11 de dezembro de 2012 10:22
  • Edson, como o Rafael disse, tente utilizar uma pivot, ex:

    create table #teste(Cliente nvarchar(10), Mes nvarchar(10), Vendas float)
    
    insert into #teste values ('Cliente01', 'JAN', 100)
    insert into #teste values ('Cliente02', 'JAN', 300)
    insert into #teste values ('Cliente03', 'JAN', 400)
    insert into #teste values ('Cliente01', 'FEV', 100)
    insert into #teste values ('Cliente02', 'FEV', 500)
    insert into #teste values ('Cliente03', 'FEV', 100)
    insert into #teste values ('Cliente01', 'MAR', 600)
    insert into #teste values ('Cliente02', 'MAR', 300)
    insert into #teste values ('Cliente03', 'MAR', 800)
    insert into #teste values ('Cliente01', 'ABR', 100)
    insert into #teste values ('Cliente02', 'ABR', 900)
    insert into #teste values ('Cliente03', 'ABR', 100)
    
    
    select * from #teste
    pivot (sum (Vendas) for MES in 
    (JAN,FEV,MAR,ABR,MAI,JUN,JUL,AGO,[SET],OUT,NOV,DEC)) as VENDAS
    


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 11 de dezembro de 2012 13:10
  • Segue outra sugestão q adaptei de um post meu recente. 

    -- tabela temporária
    declare @tb as table (Cliente varchar(10), Valor smallint, Data date)
    
    --Populando tabela
    insert into @tb (Cliente,valor,data) 
    values
    ('Maria',1, '2012-01-10'),
    ('João' ,2, '2012-01-11'),
    ('João' ,2, '2012-01-21'),
    ('João' ,2, '2012-03-29'),
    ('Maria',1, '2012-03-10'),
    ('Maria',1, '2012-05-10'),
    ('Maria',1, '2012-06-10'),
    ('Maria',1, '2012-07-10'),
    ('João' ,3, '2012-08-10')
    
    --usando a função Pivot
    SELECT * FROM 
    (
        select Cliente, Valor, 
          CASE month(data)   
            WHEN  1 THEN 'jan' WHEN  2 THEN 'fev' 
            WHEN  3 THEN 'mar' WHEN  4 THEN 'abr' 
            WHEN  5 THEN 'mai' WHEN  6 THEN 'jun' 
            WHEN  7 THEN 'jul' WHEN  8 THEN 'ago' 
            WHEN  9 THEN 'set' WHEN 10 THEN 'out' 
            WHEN 11 THEN 'nov' WHEN 12 THEN 'dez' 
        END AS Mes
        FROM @tb 
    ) as x    
    PIVOT (
            SUM(valor) FOR Mes in ([jan], [fev], [mar], [abr], [mai], [jun], [jul], [ago], [set], [out], [nov], [dez])
           ) as pv


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Edson BH terça-feira, 11 de dezembro de 2012 16:24
    terça-feira, 11 de dezembro de 2012 16:06