none
Agrupar consulta em varias Colunas RRS feed

  • 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
    terça-feira, 6 de dezembro de 2011 20:44

Respostas

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
    quarta-feira, 7 de dezembro de 2011 14:10
    Moderador
  • na verdade serão 5 dias aleatórios dentro de um período.
    quarta-feira, 7 de dezembro de 2011 19:57
    • Marcado como Resposta Frank Thadeu quinta-feira, 8 de dezembro de 2011 01:06
    quinta-feira, 8 de dezembro de 2011 01:05
  • /*
    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
    quinta-feira, 8 de dezembro de 2011 11:26