Usuário com melhor resposta
Agrupar consulta em varias Colunas

Pergunta
-
Galera, Tenho uma tabela com Departamento, Produto, Quantidade, DataEntrada. Preciso criar uma consulta agrupando os Departamento, Produto e as quantidades exibidas em colunas (cada coluna uma data).
tb_Atual
--------------------
Departamento Produto Quantidade DataEntrada
Papelaria Papel 100 2011-12-01
Papelaria Lapis 500 2011-12-01
Informatica Mouse 20 2011-12-01
Informatica teclado 30 2011-12-01
Papelaria Papel 150 2011-12-05
Papelaria Lapis 0 2011-12-05
Informatica Mouse 30 2011-12-05
Informatica teclado 50 2011-12-05
tb_transformada
-------------------------------------------------------
Departamento Produto Dia_01 Dia_05
Papelaria Papel 100 150
Papelaria Lapis 500 0
Informatica Mouse 20 30
Informatica teclado 30 50
É possível fazer isto?
- Editado Frank Thadeu quarta-feira, 7 de dezembro de 2011 13:10
Respostas
-
Consegui resolver com este procedimento de PIVOT
- Marcado como Resposta Frank Thadeu quinta-feira, 8 de dezembro de 2011 01:06
Todas as Respostas
-
Frank, É possivel com a utilização de pivot, porem, voce tera apenas os dias 01 e 05? Pois o problema do pivot é que ele fica um pouco engessado...
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com -
-
Consegui resolver com este procedimento de PIVOT
- Marcado como Resposta Frank Thadeu quinta-feira, 8 de dezembro de 2011 01:06
-
/* Fiz o seguinte script que atende sua necessidade. Basta alterar as tabelas temporarias para as fisicas.. Só executar...Abraço! */ --1 - Criando tabela 1 a ser utilizada create table #tb_Atual (Departamento varchar(30),Produto varchar(50),Quantidade int,DataEntrada DateTime) --2 - Adicionando dados para a tabela insert into #tb_Atual select 'Papelaria', 'Papel', 100, '2011-12-01' union select 'Papelaria', 'Lapis', 500, '2011-12-01' union select 'Informatica', 'Mouse', 20, '2011-12-01' union select 'Informatica', 'teclado', 30, '2011-12-01' union select 'Papelaria', 'Papel', 150, '2011-12-05' union select 'Papelaria', 'Lapis', 0, '2011-12-05' union select 'Informatica', 'Mouse', 30, '2011-12-05' union select 'Informatica', 'teclado', 50, '2011-12-05' union select 'Papelaria', 'Papel', 200, '2011-12-07' union select 'Papelaria', 'Lapis', 50, '2011-12-07' union select 'Informatica', 'Mouse', 10, '2011-12-07' union select 'Informatica', 'teclado', 0, '2011-12-07' union select 'Informatica', 'teclado', 0, '2011-12-11' --3 - Verificando tabela criada --select * from #tb_Atual --4 - como ainda nao sabemos quais sao os dias para fixar as colunas da segunda tabela podemos utilizar uma tabela de apoio temporaria select distinct 'Days_cols' = case when len(day(dataentrada)) = 1 then '0' + convert(varchar(2),day(dataentrada)) else convert(varchar(2),day(dataentrada)) end into #Days_cols from #tb_Atual --5 - Criando a segunda tabela ---> Fiz uma Modificação nessa Tabela com o nome da Coluna 'Quantidade' para 'Quantidade Total', pois achei que faria mais sentido... CREATE TABLE #tb_transformada(Departamento varchar(30),Produto varchar(50),Quantidade_Total int) --6 - Cursor para adicionar as novas colunas.... DECLARE @Dias varchar(2), @NomeColuna varchar(6) DECLARE tb_transformada_cursor CURSOR FOR SELECT Days_cols from #Days_cols OPEN tb_transformada_cursor FETCH NEXT FROM tb_transformada_cursor INTO @Dias WHILE @@FETCH_STATUS = 0 BEGIN SELECT @NomeColuna = 'Dia_' + convert(varchar(2),@Dias) EXEC ('ALTER TABLE #tb_transformada ADD ' + @NomeColuna + ' int NULL') FETCH NEXT FROM tb_transformada_cursor INTO @Dias END CLOSE tb_transformada_cursor DEALLOCATE tb_transformada_cursor --7 - Adiciona os totalizadores INSERT INTO #tb_transformada (Departamento, Produto, Quantidade_Total) select Departamento,Produto,'QtdTotal' = sum(Quantidade) from #tb_Atual group by Departamento,Produto order by 1 --8 Cursor para preencher as colunas DECLARE @Departamento varchar(30),@Produto varchar(50),@QTD varchar(50),@DiaEntrada varchar(2), @EXPRESSION Nvarchar(MAX) DECLARE tb_transformada_cursor CURSOR FOR select Departamento ,Produto ,'QTD' = SUM(Quantidade) ,'DiaEntrada' = convert(varchar(2),Day(DataEntrada)) from #tb_Atual group by Departamento,Produto, Day(DataEntrada) OPEN tb_transformada_cursor FETCH NEXT FROM tb_transformada_cursor INTO @Departamento ,@Produto ,@QTD ,@DiaEntrada WHILE @@FETCH_STATUS = 0 BEGIN SET @EXPRESSION = ('UPDATE #tb_transformada SET Dia_' + case when len(@DiaEntrada) = 1 then '0' + @DiaEntrada else @DiaEntrada end + ' = ' + @QTD + ' where Departamento = ' + '''' + @Departamento + '''' + ' and Produto = ' + '''' + @Produto + '''' ) EXEC(@EXPRESSION) FETCH NEXT FROM tb_transformada_cursor INTO @Departamento ,@Produto ,@QTD ,@DiaEntrada END CLOSE tb_transformada_cursor DEALLOCATE tb_transformada_cursor SELECT * FROM #tb_Atual SELECT * FROM #tb_transformada drop table #tb_Atual drop table #tb_transformada drop table #Days_cols
- Sugerido como Resposta Glauco Moraes quinta-feira, 8 de dezembro de 2011 11:27