Usuário com melhor resposta
consulta totalizando por mes

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;
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
-
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.
- Sugerido como Resposta Advaldo Mesquita Moreira Junior terça-feira, 11 de dezembro de 2012 13:19
- Marcado como Resposta Edson BH terça-feira, 11 de dezembro de 2012 16:24
-
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
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
-
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.
- Sugerido como Resposta Advaldo Mesquita Moreira Junior terça-feira, 11 de dezembro de 2012 13:19
- Marcado como Resposta Edson BH terça-feira, 11 de dezembro de 2012 16:24
-
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