sexta-feira, 26 de outubro de 2012

transformando várias linhas em uma só coluna

utilizando cursor e tabela virtual


concatenação de tabelas

neste exemplo vamos consultar uma tabela NxN Produto e Fornecedor, vamos listar todos os produtos e para cada produto vamos listar os seus fornecedores cadastrados, mas somente em uma única linha por produto separados por vírgula

neste exemplo também usaremos alguns recursos interessantes como tabela virtual (tabela temporária) e cursor

set nocount on
--tabelas para testes
create table produto (ID_PRODUTO int, NOM_PRODUTO varchar(50))
insert into produto (ID_PRODUTO, NOM_PRODUTO ) values (1, 'PRODUTO 1')
insert into produto (ID_PRODUTO, NOM_PRODUTO ) values (2, 'PRODUTO 2')
insert into produto (ID_PRODUTO, NOM_PRODUTO ) values (3, 'PRODUTO 3')
        
create table fornecedor(ID_FORNECEDOR int, NOM_FORNECEDOR varchar(50))
insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (1, 'FORNECEDOR 1')
insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (2, 'FORNECEDOR 2')
insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (3, 'FORNECEDOR 3')
insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (4, 'FORNECEDOR 4')
               
create table forn_prod (ID_PRODUTO int, ID_FORNECEDOR int)
insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (1, 1)
insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (2, 1)
insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (1, 2)
insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (2, 2)
insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (1, 4)
        
        
        
--tabela temporaria
create table #temp (NOM_PRODUTO varchar(50), NOM_FORNECEDOR varchar(4000))
        
--select distinct para buscar somente produtos que estejam na tabela forn_prod
--cursor x: produtos
declare x cursor for select distinct forn_prod.ID_PRODUTO, NOM_PRODUTO from forn_prod
                                inner join produto on produto.ID_PRODUTO = forn_prod.ID_PRODUTO
        --variaveis para o cursor x
        declare @ID_PRODUTO int
        declare @NOM_PRODUTO varchar(50)
        --variável para concatenar o nome dos fornecedores
        declare @NOM_FORNECEDOR_conc varchar(8000)
        open x
        fetch next from x into @ID_PRODUTO,@NOM_PRODUTO
        while @@fetch_Status=0
        begin
                --zerando variável de concatenação
                set @NOM_FORNECEDOR_conc = ''
                --cursor y: fornecedores relacionados com os produtos, vai concatenar os fornecedores na variável @NOM_FORNECEDOR_conc
                declare y cursor for select NOM_FORNECEDOR from fornecedor
                                        inner join forn_prod on forn_prod.ID_FORNECEDOR = fornecedor.ID_FORNECEDOR
                                        where forn_prod.ID_PRODUTO = @ID_PRODUTO
                --variavel para o cursor y
                declare @NOM_FORNECEDOR varchar(50)
                open y
                fetch next from y into @NOM_FORNECEDOR
                while @@fetch_Status=0
                begin
                        --concatenando fornecedores na variável @NOM_FORNECEDOR_conc
                        set @NOM_FORNECEDOR_conc = @NOM_FORNECEDOR_conc + @NOM_FORNECEDOR + ', '
        
                        --loop do cursor y
                        fetch next from y into @NOM_FORNECEDOR
                end
                --fim do cursor y
                close y
                deallocate y  
        
                --retira última virgula
                set @NOM_FORNECEDOR_conc = substring(@NOM_FORNECEDOR_conc, 1, len(@NOM_FORNECEDOR_conc)-1)
                --insere na tabela virtual
                insert into #temp (NOM_PRODUTO, NOM_FORNECEDOR )
                values (@NOM_PRODUTO, @NOM_FORNECEDOR_conc)
        
                --loop do cursor x
                fetch next from x into @ID_PRODUTO,@NOM_PRODUTO
        end
--fim do cursor x
close x
deallocate x
        
--consulta da tabela temporaria
select * from #temp
       
--apagando tabela temporaria
drop table #temp
--apagando tabelas para testes
drop table produto
drop table fornecedor
drop table forn_prod


Resultado:
NOM_PRODUTO                    NOM_FORNECEDOR
PRODUTO 1                      FORNECEDOR 1, FORNECEDOR 2, FORNECEDOR 4
PRODUTO 2                      FORNECEDOR 1, FORNECEDOR 2



AUTOR: "eriva_br"

Dúvidas, criticas, contribuições, correções e adições seram bem vindas. 

Nenhum comentário:

Postar um comentário