Ir para conteúdo
Fórum Script Brasil
  • 0

Unir uns campos


ESTG

Pergunta

Boas Mestres,

é o seguinte eu queria fazer o seguinte eu tenho uma tabela parecida com a de baixo

Nome | telefone|

Ana | 923424|

Ana |2342342|

Pedro | 542342|

Pedro | 342424|

andre | 4234234|

eu queria fazer um select para ficar

Nome | telefone|

Ana | 923424 , 2342342|

Pedro | 542342,342424|

andre | 4234234|

Eu já tentei um codigo que topei na net, vou deixar aqui :

declare @telefone varchar(25)
declare @aux varchar(200)
declare @Nome varchar(200)

set @aux = '' 

DECLARE CurNome CURSOR FOR
SELECT DISTINCT nome FROM #Temp OPEN CurNome
FETCH NEXT FROM CurNome INTO @ContactName
WHILE @@FETCH_STATUS = 0
BEGIN DECLARE CurTelefone CURSOR FOR
SELECT Nome,telefone FROM #temp WHERE nome=@nome	
	OPEN CurTelefone    
    FETCH NEXT FROM telefone INTO  @nome,@telefone
	WHILE @@FETCH_STATUS = 0
	BEGIN IF @aux = ''
		BEGIN SET @aux = @telefone
		END
		ELSE
		BEGIN SET @aux = @aux+ ',' + @telefone
		END                           
		FETCH NEXT FROM CurTelefone INTO @Nome,@telefone
	END
	CLOSE CurTelefone
	DEALLOCATE CurTelefone

INSERT INTO #Temp VALUES (@Nome,@aux)

SET @aux = ''


FETCH NEXT FROM CurNome INTO @Nome
END
CLOSE CurNome
DEALLOCATE CurNome

Depois de correr isto o que me aparece é :

Ana | 923424 , 2342342|

Ana | 923424|

Ana |2342342|

Pedro | 542342,342424|

Pedro | 542342|

Pedro | 342424|

andre | 4234234|

O que eu queria era se alguém me podia ajudar o que tenho de fazer no meu codigo para não aparecer os campos a negrito.

Se alguém conhecer uma soluçao que não envolva tabelas temporarias e cursores e me puder dizer agradecia.

Obrigado

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Seria melhor voce pensar numa forma melhor de gravar esses dados, se por acaso forem muitos telefones. Ou então definir um numero fixo de colunas, exemplo: um numero residencial, um numero celular, um numero comercial. Gravando todos em colunas.

montei um exemplo com cursor:

DECLARE @nome VARCHAR(50), @telefone VARCHAR(50), @tempNome VARCHAR(50)
set @tempNome = ''

DECLARE Cursor01 CURSOR FOR
select nome, telefone from teste order by nome
OPEN Cursor01

FETCH NEXT FROM Cursor01 INTO @nome, @telefone
WHILE @@FETCH_STATUS = 0 BEGIN IF @tempNome <> @nome BEGIN print '--------------------------'
		print @nome + ':'
	END
		print @telefone

	set @tempNome = @nome

	FETCH NEXT FROM Cursor01 INTO @nome, @telefone

END

CLOSE Cursor01
DEALLOCATE Cursor01

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Amigo,

Baseado no exemplo q postou, criei uma rotina pra concatenar as informações de telefone.

Neste exemplo, declarei algumas variáveis aleatórias. você terá q adaptdar à sua base. Ao invés de declarar ponteiros, criei colunas pra controlar o processo. Inseri alguns comentários pra ficar mais fácil entender. Espero q ajude. Vai rodando passo a passo.

Não tem como você concatenar as informações sem utilizar tabela auxiliar...

Qualquer dúvida q tiver, posta ai!!!

-- criação da tabela
create table dbo.Dados (Nome varchar(80), telefone int)

-- inserção dos dados
insert into Dados (nome, telefone) values ('Ana', 923424)
insert into Dados (nome, telefone) values ('Ana' ,2342342)
insert into Dados (nome, telefone) values ('Pedro' , 542342)
insert into Dados (nome, telefone) values ('Pedro' , 342424)
insert into Dados (nome, telefone) values ('andre' , 4234234)

-- verificação 
select * from Dados

-- criação de temporária em instância.
create table #tmp (nome varchar(80), telefones varchar(80), controlador tinyint)

-- criação de temporária que conterá os telefones da pessoa
create table #telefones (telefones varchar(80), controlador tinyint)

-- inserção dos dados distintos na temporária.
insert into #tmp (nome)
select distinct nome from Dados

-- verificação 
select * from #tmp

-- declaração de variável. Selecione tudo para baixo e rode até onde está os *********
Declare @Pessoa as varchar(80)
Declare @TelefoneConcatenado as varchar(100)
Declare @Telefone as varchar(15)

Set @Pessoa = (select top 1 nome from #tmp where controlador is null) 

-- loop para cada pessoa existente na tabela #tmp.
while @Pessoa is not null
Begin
  truncate table #telefones
  -- inserção dos telefones na tabela temporária #telefones, para fazer a concatenação das informações.
  insert into #telefones (telefones)
  select telefone from dados where nome=@Pessoa
  -- atribuindo valor
  set @Telefone = (select top 1 telefones from #telefones where controlador is null)
  -- loop para concatenar os telefones.
  While @Telefone is not null
  Begin
    if @TelefoneConcatenado is null
      Set @TelefoneConcatenado = @Telefone
    Else
      Set @TelefoneConcatenado = @TelefoneConcatenado + ', ' + @Telefone
    update #telefones set controlador=1 where telefones=@Telefone
    set @Telefone = (select top 1 telefones from #telefones where controlador is null)
  End 
  -- gravação dos telefones concatenados na tabela #tmp
  update #tmp set telefones=@TelefoneConcatenado where nome=@Pessoa
  Set @TelefoneConcatenado = null
  -- alterando a pessoa
  update #tmp set controlador=1 where nome=@Pessoa
  Set @Pessoa = (select top 1 nome from #tmp where controlador is null) 
End

-- até aqui. *********

-- verificação
select * from Dados
select * from #tmp

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...