none
Concatenar Registros

    Pergunta

  •  

    Olá... alguém poderia me dizer como faço para concatenar os registros de uma tabela?

     

    Desde já obrigado pela atenção.

    terça-feira, 2 de outubro de 2007 16:58

Respostas

  •  

    E aí pessoal.

     

    Alexandre, eu tenho uma situação relativamente semelhante. Num relatório, preciso pegar alguns dados do cliente e mostrar como sendo apenas uma informação, por exemplo, telefones. Digamos que a pessoa tem 3 telefones, então preciso concatenas os 3 registros e mostrar como sendo apenas um. Para resolver esse problema, usei uma função, que pode ser usada diretamente no select sobre o cliente. Veja o exemplo:

     

    Code Block

    -- ### Criação de tabelas de exemplo ###

    CREATE TABLE dbo.Clientes (

    codigoCliente INT IDENTITY PRIMARY KEY,

    nome varchar (100))

    GO

    CREATE TABLE dbo.Telefones (

    codigoTelefone INT IDENTITY PRIMARY KEY,

    codigoCliente INT,

    telefone VARCHAR (30))

    GO

     

    -- ### População das tabelas ###

    INSERT INTO dbo.Clientes (nome) VALUES ('Alexandre')

    INSERT INTO dbo.Clientes (nome) VALUES ('João')

    INSERT INTO dbo.Clientes (nome) VALUES ('Maria')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (1, '12345')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (1, '87645')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (2, '23546')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (3, '35436')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (3, '24096')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (3, '97664')

    GO

     

    -- ### Criação da função ###

    CREATE FUNCTION dbo.fnConcatenaTelefones (@codigoCliente INT)

    RETURNS VARCHAR (100)

    AS

    BEGIN

    DECLARE @Fones VARCHAR(100)

    SELECT @Fones = ''

    -- ### Concatena fones ###

    SELECT @Fones = @Fones + telefone + ' - ' FROM dbo.Telefones

    WHERE codigoCliente = @codigoCliente

    -- ### Remove caractéres desenecessários ###

    SELECT @Fones = LEFT (@Fones, LEN (@Fones) - 2)

    RETURN @Fones

    END

    GO

    -- ### Consulta usando a função ###

    SELECT C.nome, dbo.fnConcatenaTelefones (C.codigoCliente)

    FROM dbo.Clientes C

     

     

     

    Claro, este é apenas um exemplo. Veja se te ajuda.

     

     

    Abraço

    quarta-feira, 3 de outubro de 2007 03:17
  • Boa tarde Alexandre

     

    Independente da estrutura dos seus dados você deve criar algo parecido com o exemplo abaixo.Qualquer dúvida retorne

     

     

    Create Table #Tmp_Concatena(
     Registro int identity(1,1),
     Linhas varchar(8000))

     

    Create Table #Tmp_Concatenado(Registros text)

     

    Insert into #Tmp_Concatenado values ('')

    Declare @int_inicio int
     @int_final int
     @str_texto varchar(8000)


    Select SEUCAMPO Into #Tmp_Concatena From SUATABELA Where SUACODICAO

    Select @int_inicio = 1
    select @int_final = Count(*) From SUATABELA WHERE SUACONDICAO


    While @int_inicio <= @int_final
    Begin

       Select @str_texto = SUALINHA FROM #Tmp_Concatena

       Update #Tmp_Concatenado Set Registros = Registro + Char(13) + @str_texto

       Set @int_inicio = @int_inicio + 1
    End

     

    Select Registros From #Tmp_Concatenado

     

     

    Espero ter ajudado
    terça-feira, 2 de outubro de 2007 17:42

Todas as Respostas

  • Boa tarde Alexandre

     

     

    Não existe segredo, o importante é lembrar de converter os tipos para evitar eventuais problemas. Dá uma olhada no exemplo

     

     

    Create Table dbo.Teste(

    Codigo int not null,

    PrimeiroNome varchar(100),

    SobreNome varchar(100),

    Cidade varchar(100))

    GO

     

    Select Cast(Codigo as varchar) + PrimeiroNome + SobreNome + Cidade as Concatenado From dbo.TabelaTeste

     

     

     

     

     

     

    Espero ter ajudado

     

    terça-feira, 2 de outubro de 2007 17:03
  • Olá Anderson,

     

    Não são as colunas e sim um determinado número de linhas!

     

    Obrigado

    terça-feira, 2 de outubro de 2007 17:15
  • Alexandre

     

    É possível sim, passa a estrutura da sua tabela e os campos que te mostro um exemplo.

     

    terça-feira, 2 de outubro de 2007 17:23
  • Boa tarde Alexandre

     

    Independente da estrutura dos seus dados você deve criar algo parecido com o exemplo abaixo.Qualquer dúvida retorne

     

     

    Create Table #Tmp_Concatena(
     Registro int identity(1,1),
     Linhas varchar(8000))

     

    Create Table #Tmp_Concatenado(Registros text)

     

    Insert into #Tmp_Concatenado values ('')

    Declare @int_inicio int
     @int_final int
     @str_texto varchar(8000)


    Select SEUCAMPO Into #Tmp_Concatena From SUATABELA Where SUACODICAO

    Select @int_inicio = 1
    select @int_final = Count(*) From SUATABELA WHERE SUACONDICAO


    While @int_inicio <= @int_final
    Begin

       Select @str_texto = SUALINHA FROM #Tmp_Concatena

       Update #Tmp_Concatenado Set Registros = Registro + Char(13) + @str_texto

       Set @int_inicio = @int_inicio + 1
    End

     

    Select Registros From #Tmp_Concatenado

     

     

    Espero ter ajudado
    terça-feira, 2 de outubro de 2007 17:42
  • Anderson,

     

    Muito legal o seu exemplo, parabéns!!!

     

    terça-feira, 2 de outubro de 2007 18:36
  • Obrigado Junior, estamos sempre de plantão e quando podemos ajudar é um prazer.

     

     

     

    Gde abraço

    terça-feira, 2 de outubro de 2007 18:44
  •  

    E aí pessoal.

     

    Alexandre, eu tenho uma situação relativamente semelhante. Num relatório, preciso pegar alguns dados do cliente e mostrar como sendo apenas uma informação, por exemplo, telefones. Digamos que a pessoa tem 3 telefones, então preciso concatenas os 3 registros e mostrar como sendo apenas um. Para resolver esse problema, usei uma função, que pode ser usada diretamente no select sobre o cliente. Veja o exemplo:

     

    Code Block

    -- ### Criação de tabelas de exemplo ###

    CREATE TABLE dbo.Clientes (

    codigoCliente INT IDENTITY PRIMARY KEY,

    nome varchar (100))

    GO

    CREATE TABLE dbo.Telefones (

    codigoTelefone INT IDENTITY PRIMARY KEY,

    codigoCliente INT,

    telefone VARCHAR (30))

    GO

     

    -- ### População das tabelas ###

    INSERT INTO dbo.Clientes (nome) VALUES ('Alexandre')

    INSERT INTO dbo.Clientes (nome) VALUES ('João')

    INSERT INTO dbo.Clientes (nome) VALUES ('Maria')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (1, '12345')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (1, '87645')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (2, '23546')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (3, '35436')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (3, '24096')

    INSERT INTO dbo.Telefones (codigoCliente, telefone) VALUES (3, '97664')

    GO

     

    -- ### Criação da função ###

    CREATE FUNCTION dbo.fnConcatenaTelefones (@codigoCliente INT)

    RETURNS VARCHAR (100)

    AS

    BEGIN

    DECLARE @Fones VARCHAR(100)

    SELECT @Fones = ''

    -- ### Concatena fones ###

    SELECT @Fones = @Fones + telefone + ' - ' FROM dbo.Telefones

    WHERE codigoCliente = @codigoCliente

    -- ### Remove caractéres desenecessários ###

    SELECT @Fones = LEFT (@Fones, LEN (@Fones) - 2)

    RETURN @Fones

    END

    GO

    -- ### Consulta usando a função ###

    SELECT C.nome, dbo.fnConcatenaTelefones (C.codigoCliente)

    FROM dbo.Clientes C

     

     

     

    Claro, este é apenas um exemplo. Veja se te ajuda.

     

     

    Abraço

    quarta-feira, 3 de outubro de 2007 03:17
  • Alexander VM....

     

    Cara sua solução é mt fod...

    Caramba passei a porcaria da minha vida inteira usando cursor para fazer isso... hahahahha

     

    Valew mesmo!!

    sábado, 16 de outubro de 2010 15:52