none
Concatenar Linhas Com CHAMADOS! RRS feed

  • Pergunta

  • Bom Dia Pessoal

    Estou com o seguinte problema.

    Tenho esses campos, com os seguintes resultados:

    Nome_Cliente|Cod_faturamento|Tipo_Contrato|Numero_Vigencia|Data_Vencimento|Chamado|Valor_Total

    Escola X         |      107                |   Serviço        |     114                | 10/11/2012         |    8563     | 183,14

    Escola X         |      107                |   Serviço        |     114                | 10/11/2012         |    7245     | 183,14

    Escola X         |      107                |   Serviço        |     114                | 10/11/2012         |    8956     | 183,14

    Escola X         |      107                |   Serviço        |     114                | 10/11/2012         |    6569     | 183,14

    Escola X         |      107                |   Serviço        |     114                | 10/11/2012         |    5948     | 183,14

    Mas preciso que seja concatenado os números de chamados quando o número da fatura for igual, pois aquele valor é o valor total da fatura, e dentro desta fatura tem todos esses chamados:

    Nome_Cliente|Cod_faturamento|Tipo_Contrato|Numero_Vigencia|Data_Vencimento|                 Chamado                      |Valor_Total

    Escola X         |      107                |   Serviço        |     114                | 10/11/2012         |    8563/7245/8956/6569/5948     | 183,14

    Alguem tem alguma dica?



    • Editado Lucas_Batista quinta-feira, 1 de novembro de 2012 12:21
    quinta-feira, 1 de novembro de 2012 12:17

Respostas

  • Lucas, veja o exemplo que montei usando um looping, tente fazer assim:

    create table #temp (Nome_Cliente varchar(20), Cod_faturamento int, Tipo_Contrato varchar(20),Numero_Vigencia int,Data_Vencimento char(10), chamado int, Valor_Total float  )
    create table #temp2 (Nome_Cliente varchar(20), Cod_faturamento int, Tipo_Contrato varchar(20),Numero_Vigencia int,Data_Vencimento char(10),  Valor_Total float  )
    
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 8563, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 7245, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 8956, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 6569, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 5948, 183.14
    insert into #temp
    select 'Escola Y', 107, 'Serviço', 114, '10/11/2012', 6000, 183.14
    insert into #temp
    select 'Escola Y', 107, 'Serviço', 114, '10/11/2012', 6001, 183.14
    
    insert into #temp2
    select distinct Nome_Cliente, cod_Faturamento, Tipo_Contrato,Numero_Vigencia,Data_Vencimento,Valor_Total from #temp
    
    alter table #temp2 add chamado varchar(200)
    
    declare @chamado int
    
    while (select COUNT(*) from #temp) > 0
    begin
    set @chamado = (select top 1 chamado from #temp)
    
    update T2
    set T2.chamado = isnull(T2.chamado,'') + '/' + cast(T.chamado as varchar)
    from #temp2 as T2
    inner join #temp as T on T2.Cod_faturamento = T.Cod_faturamento and T2.Data_Vencimento = T.Data_Vencimento
    and T2.Nome_Cliente = T.Nome_Cliente and T2.Numero_Vigencia = T.Numero_Vigencia and T2.Tipo_Contrato = T.Tipo_Contrato and T2.Valor_Total = T.Valor_Total
    where T.chamado = @chamado
    
    delete from #temp where chamado = @chamado
    
    set @chamado = (select top 1 chamado from #temp)
    
    end
    
    select * from #temp2


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta éricat quinta-feira, 1 de novembro de 2012 17:12
    • Marcado como Resposta Gustavo M. Guimarães segunda-feira, 10 de dezembro de 2012 12:40
    quinta-feira, 1 de novembro de 2012 16:55

Todas as Respostas

  • Aqui tem um exemplo pra fazer exatamente o que precisa: http://www.robersonferreira.com.br/concatenando-linhas/.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 1 de novembro de 2012 15:37
    Moderador
  • Não consegui usar aquela função no código, da esse erro:

    -Conversion failed when converting the varchar value '/' to data type int.-

    quinta-feira, 1 de novembro de 2012 16:25
  • Você não deve usar exatamente aquela função. Você deve adaptá-la à sua situação. Aquele artigo é um exemplo, mas que simboliza exatamente o que você quer fazer.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 1 de novembro de 2012 16:35
    Moderador
  • Lucas, veja o exemplo que montei usando um looping, tente fazer assim:

    create table #temp (Nome_Cliente varchar(20), Cod_faturamento int, Tipo_Contrato varchar(20),Numero_Vigencia int,Data_Vencimento char(10), chamado int, Valor_Total float  )
    create table #temp2 (Nome_Cliente varchar(20), Cod_faturamento int, Tipo_Contrato varchar(20),Numero_Vigencia int,Data_Vencimento char(10),  Valor_Total float  )
    
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 8563, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 7245, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 8956, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 6569, 183.14
    insert into #temp
    select 'Escola X', 107, 'Serviço', 114, '10/11/2012', 5948, 183.14
    insert into #temp
    select 'Escola Y', 107, 'Serviço', 114, '10/11/2012', 6000, 183.14
    insert into #temp
    select 'Escola Y', 107, 'Serviço', 114, '10/11/2012', 6001, 183.14
    
    insert into #temp2
    select distinct Nome_Cliente, cod_Faturamento, Tipo_Contrato,Numero_Vigencia,Data_Vencimento,Valor_Total from #temp
    
    alter table #temp2 add chamado varchar(200)
    
    declare @chamado int
    
    while (select COUNT(*) from #temp) > 0
    begin
    set @chamado = (select top 1 chamado from #temp)
    
    update T2
    set T2.chamado = isnull(T2.chamado,'') + '/' + cast(T.chamado as varchar)
    from #temp2 as T2
    inner join #temp as T on T2.Cod_faturamento = T.Cod_faturamento and T2.Data_Vencimento = T.Data_Vencimento
    and T2.Nome_Cliente = T.Nome_Cliente and T2.Numero_Vigencia = T.Numero_Vigencia and T2.Tipo_Contrato = T.Tipo_Contrato and T2.Valor_Total = T.Valor_Total
    where T.chamado = @chamado
    
    delete from #temp where chamado = @chamado
    
    set @chamado = (select top 1 chamado from #temp)
    
    end
    
    select * from #temp2


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta éricat quinta-feira, 1 de novembro de 2012 17:12
    • Marcado como Resposta Gustavo M. Guimarães segunda-feira, 10 de dezembro de 2012 12:40
    quinta-feira, 1 de novembro de 2012 16:55
  • Boa tarde,

    Segue uma outra sugestão:

    ;with CTE as
    (
        select distinct
            Nome_Cliente, 
            Cod_faturamento, 
            Tipo_Contrato,
            Numero_Vigencia,
            Data_Vencimento,
            Valor_Total
        from Tabela
    )
    
    select
        Nome_Cliente, 
        Cod_faturamento, 
        Tipo_Contrato,
        Numero_Vigencia,
        Data_Vencimento, 
        STUFF( (SELECT '/' + CAST(chamado as varchar)
                FROM Tabela as s
                WHERE s.Nome_Cliente = t.Nome_Cliente and
                      s.Cod_faturamento = t.Cod_faturamento and
                      s.Tipo_Contrato = t.Tipo_Contrato and
                      s.Numero_Vigencia = t.Numero_Vigencia and
                      s.Data_Vencimento = t.Data_Vencimento and
                      s.Valor_Total = t.Valor_Total
                FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
                ,1, 1, '') as chamado,
        Valor_Total
    from CTE as t
    

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 1 de novembro de 2012 17:49