none
Concatendo os registros RRS feed

  • Pergunta

  • Tenho uma tabela NF

    Cliente   NF
    1            10
    1            20
    1            30

    como no select faço para trazer

    Cliente     NF
    1             10/20/30


    existe a possibilidade?
    Carlos Lima
    quinta-feira, 5 de fevereiro de 2009 19:13

Respostas

Todas as Respostas

  • Boa Tarde,

    Essa dúvida é recorrente (uma pesquisa prévia nos fóruns pode lhe indicar a resposta). Antes de propriamente respondê-la eu indicaria a leitura prévia dos seguintes artigos:

    Concatenando registros
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!185.entry

    SQL Server 2005 T-SQL Tips: Concatenando e Agrupando
    http://www.plugmasters.com.br/sys/materias/869/1/SQL-Server-2005-T-SQL-Tips:-Concatenando-e-Agrupando

    Seu SQL Server é 2005 ? A quantidade de registros é fixa ou possui um valor máximo ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com
    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Odraude Solrac quinta-feira, 26 de fevereiro de 2009 13:30
    quinta-feira, 5 de fevereiro de 2009 19:20
  • sql 2000

    os registros estão na mesma tabela e não são fixos, não os quero como coluna, quero apenas concatenar um registro com outro e agrupar por cliente.

    li os artigos e não consegui visualizar a situação a qual preciso, vi com tabelas relacionadas.
    Carlos Lima
    quinta-feira, 5 de fevereiro de 2009 19:54
  • Boa Noite Carlos,

    É uma pena que você esteja no 2000, pois, nos demais as possibilidades são maiores. Em todo caso, segue uma solução 2000 based.

    1 declare @t table (Cliente INT, NF CHAR(2))  
    2 insert into @t values (1, '10')  
    3 insert into @t values (1, '20')  
    4 insert into @t values (1, '30')  
    5 insert into @t values (2, '45')  
    6 insert into @t values (2, '55')  
    7 insert into @t values (3, '67')  
    8 insert into @t values (4, '76')  
    9 insert into @t values (5, '88')  
    10 insert into @t values (5, '91')  
    11  
    12 select distinct cliente,  
    13 replace(  
    14 replace(  
    15 (select nf from @t as tint where tout.cliente = tint.cliente for xml raw),  
    16 '<row nf="',''),'"/>','/')  
    17 from @t as tout 

    Nos artigos fiz em tabelas separadas, pois, normalmente o processo de normalização irá separá-las (não é comum ter clientes e notas na mesma tabela por exemplo). De qualquer forma, um SELECT pode unir as tabelas separadas e montar uma única "visão".

    No artigo do meu blog, demonstro como fazer isso através de um function. É aplicável a sua situação também e inclusive utiliza uma única tabela (Contatos)

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 6 de fevereiro de 2009 00:55
  • Carlos,

    porque você não faz assim...

    Select cd_cliente, nf_client( cd_client ) From Tabela where ....

    A nf_client é uma função definida pelo usuário onde você facilmente monta o código e retorna a lista do jeito que quizer...

    espero ter ajudado!

    Henrique 
    Consultor .Net
    • Sugerido como Resposta joaofabel sexta-feira, 6 de fevereiro de 2009 19:52
    sexta-feira, 6 de fevereiro de 2009 19:37
  • Boa Tarde,

    A idéia da function é interessante. Foi justamente a solução que propus em:

    Concatenando registros
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!185.entry

    Embora eu ache que o XML é mais eficiente

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com
    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 6 de fevereiro de 2009 20:01
  • Olá,

    Nessa solução 2000 based esta dando o seguinte erro

    declare @t table (Cliente INT, NF CHAR(2))

    insert into @t values (1, '10')

    insert into @t values (1, '20')

    insert into @t values (1, '30')

    insert into @t values (2, '45')

    insert into @t values (2, '55')

    insert into @t values (3, '67')

    insert into @t values (4, '76')

    insert into @t values (5, '88')

    insert into @t values (5, '91')

    select distinct cliente,

    replace(

    replace(

    (select nf from @t as tint where tout.cliente = tint.cliente for xml raw),

    '<row nf="',''),'"/>','/')

    from @t as tout




    Msg 170, Level 15, State 1, Line 15

    Line 15: Incorrect syntax near 'xml'.




    Carlos Lima
    quarta-feira, 25 de fevereiro de 2009 19:04
  • Carlos,

    Não estou conseguindo entender exatamente o que o Replace deverá fazer na sua subquery?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 25 de fevereiro de 2009 19:40
  • este exemplo foi postado pelo gustavo, deve ser para remover os caracteres gerados pelo for xml.

    mesmo removendo ainda sim não funciona. dá um erro nesse xml.
    Carlos Lima
    quarta-feira, 25 de fevereiro de 2009 21:30
  • Olá Carlos,

    Não estou com o SQL Server 2000 para testar, mas ao usar um banco 2005 com Compatibility Level 80, o código passou.
    Atualmente estou impossibilitado de utilizar um SQL Server 2000 já que estou "um pouco distante".

    Se a solução não for suficiente, sugiro dar uma olhada no link do plugmasters postado anteriormente.
    Há soluções baseadas em subqueries, cursores, etc.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com/

    MVP Summit 2009 - Pré Evento em NY - dia 1.2
    http://diegonogare.spaces.live.com/blog/cns!C9B677082DFAE43D!2023.entry


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 25 de fevereiro de 2009 22:32
  • gustavo,

    resolvido o seu tópico em http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!185.entry resolveu meu problema, o jeito foi criar uma função e na consulta chamar passando os parametros.

    obrigado mais uma vez pela ajuda.

    abs


    Carlos Lima
    quinta-feira, 26 de fevereiro de 2009 13:29