Jump to content

Archived

This topic is now archived and is closed to further replies.

eriva_br

transformando várias linhas em uma só coluna

Recommended Posts

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 4PRODUTO 2										  FORNECEDOR 1, FORNECEDOR 2

AUTOR: "eriva_br"

 

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

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.