none
Concatenar números em ordem decrescente. RRS feed

  • Pergunta

  • Tenho cinco colunas com números (int), quero fazer um update/Set  e colocar esses 5 numeros concatenados em ordem decrescente em uma outra coluna (concatenado).

    C1 C2 C3 C4 C5    CONCATENADO
    6    7   4   3   9              97643
    1    2   3  5    3              53321
    5    2   4   5   1              55421
    3    2   4   3   3              43332
    2    2   1   2   6              62221
    5    1   1   4   4              54411

    agradeço antecipadamente

    Fernando Fornarolo


    • Editado Forna2015 quinta-feira, 30 de julho de 2015 15:59
    quinta-feira, 30 de julho de 2015 15:48

Respostas

Todas as Respostas

  • Deleted
    quinta-feira, 30 de julho de 2015 16:13
  • José Diz,

    Obrigado pela pronta resposta,mas minha tabela não tem chave primária e os números são de um só algarismo.

    Se você puder levar em conta essas informações, o novato aqui agradece e muito.

    Fernando Fornarolo

    • Marcado como Resposta Forna2015 quinta-feira, 30 de julho de 2015 17:51
    quinta-feira, 30 de julho de 2015 16:35
  • Deleted
    • Marcado como Resposta Forna2015 quinta-feira, 30 de julho de 2015 17:51
    quinta-feira, 30 de julho de 2015 17:01
  • José Diz, perfeito funciona 

    Rápido e eficiente, bom trabalho

    Valeu pela grande ajuda

    Fernando Fornarolo

    • Marcado como Resposta Forna2015 quinta-feira, 30 de julho de 2015 17:51
    quinta-feira, 30 de julho de 2015 17:51
  • Eis outra abordagem, utilizando função para concatenar os algarismos.

    Não me parece uma solução eficiente, mas funciona.

    -- código 2 v2
    CREATE FUNCTION dbo.ConcatenaValores (@C1 int, @C2 int, @C3 int, @C4 int, @C5 int)
    returns int as
    begin
    
    declare @Concatenado varchar(5);
    set @Concatenado= space(0);
    SELECT @Concatenado+= Cast(N as char(1))
      from (values (@C1), (@C2), (@C3), (@C4), (@C5)) as Numeros(N)
      order by N desc;
    return Cast(@Concatenado as int); end;
    go

    e

    -- código 3
    UPDATE Tab
      set Concatenado= dbo.ConcatenaValores(C1, C2, C3, C4, C5);


        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)




    José Diz,

    Muito legal este exemplo, o pulo do gato é justamente o uso da função Space().


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 31 de julho de 2015 18:34
  • Boa tarde,

    Estava tudo certo, mas quando juntei tudo, apresentou mensagem de Erro:

    --- ORDENAR LINHAS

    CREATE FUNCTION dbo.ordeliValores (@l1 int, @l2 int, @l3 int, @l4 int, @l5 int)

    returns int as
    begin

    declare @ordelinha int;
    set @ordelinha= space(0);
    SELECT @ordelinha+= Cast(N as char(1))
      from (values (@l1), (@l2), (@l3), (@l4), (@l5)) as Numeros(N)
      order by N desc;
    return Cast(@ordelinha as int);
    end;
    go

    UPDATE jogo
      set ordelinha= dbo.ordeliValores(l1, l2, l3, l4, l5);

    *********************************************************

    após executar o passo acima:

    Mensagem 111, Nível 15, Estado 1, Linha 2
    'CREATE FUNCTION' deve ser a primeira instrução em um lote de consultas.
    Mensagem 137, Nível 15, Estado 2, Linha 9
    É necessário declarar a variável escalar "@l1".
    Mensagem 178, Nível 15, Estado 1, Linha 11
    Uma instrução RETURN com um valor retornado não pode ser usada neste contexto.

    **************************************************************************

    novamente solicito ajuda 

    Fernando Fornarolo

    domingo, 2 de agosto de 2015 21:12
  • Boa noite,

    Fernando, experimente mais ou menos dessa forma:

    with CTE_Conc as
    (
        select
            *,
            (SELECT CAST(C AS VARCHAR(10))
             FROM (VALUES (t.C1), (t.C2), (t.C3), (t.C4), (t.C5)) as v(C)
             ORDER BY C DESC
             FOR XML PATH(''), TYPE).value('.', 'varchar(max)') AS ConcXML
        from Tabela as t
    )
    
    update CTE_Conc
    set CONCATENADO = CAST(ConcXML AS INT)
    

    Espero que ajude.


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

    domingo, 2 de agosto de 2015 23:54
  • Obrigado pela nova resposta, vou testar assim que retornar para casa, visto que a não estou conseguindo fazer a conexão remota do SQL server 2012.

    Assim que, retorno resolver/coisa de iniciante...

    Fernando Fornarolo

     
    segunda-feira, 3 de agosto de 2015 15:27
  • Boa Tarde, José Diz

    Voltando na questão  ordenar decrescente apresentou a seguinte mensagem erro:

    Mensagem 111, Nível 15, Estado 1, Linha 3
    'CREATE FUNCTION' deve ser a primeira instrução em um lote de consultas.
    Mensagem 137, Nível 15, Estado 2, Linha 10
    É necessário declarar a variável escalar "@l1".
    Mensagem 178, Nível 15, Estado 1, Linha 12
    Uma instrução RETURN com um valor retornado não pode ser usada neste contexto.

    Novamente o que esta errado, tem como fazer sem usar Function?

    Se você puder me ajudar novamente, ficaria muito grato.

    Obrigago

    Fernando//

    segunda-feira, 3 de agosto de 2015 21:51
  • Fernando, a sugestão que postei acima não utiliza uma função.


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

    segunda-feira, 3 de agosto de 2015 21:57
  • Bom dia,

    Ok, vou tentar novamente.

    Obrigado.

    terça-feira, 4 de agosto de 2015 11:16