locked
UPDATE ARREDONDAR VALOR

    Pergunta

  • Olá Amigos,

    preciso executar um update arredondando os valores de um campo.

    preciso arrendondar da seguinte forma:

    só vou arredondar os valores decimais, Exemplo:

    valor original                 valor depois do update

    1.27                                      1.49

    1.68                                      1.99

    2.05                                      1.99

    regras:
    se a casa decimal for menor que 09 e maior que 0 arrendondar para (-1),99 = -1x.99
    se a casa decimal for maior que que 09 e menor que 59 arrendondar para ,49 = x.49
    se a casa decimal for maior que que 59 e menor que 00 arrendondar para ,99 = x.99

    desde já, grato.

    quarta-feira, 16 de maio de 2018 15:38

Respostas

  • Boa tarde, ABRÃOHITO!

    Segundo a descrição, você poderia usar um código semelhante a esse:

    Create Table #t_Valor
    (
    	Valor Decimal(10, 2)
    )
    
    Insert Into #t_Valor
    Values
    	(1.27) --1.49
    	,(1.68) --1.99
    	,(2.05) --1.99
    
    Select * From #t_Valor
    
    Update	#t_Valor
    Set		Valor = Case 
    					When Valor - Convert(Int, Valor) Between 0.01 And 0.08 Then Convert(Decimal(10, 2), Convert(Int, Valor)) - 0.01
    					When Valor - Convert(Int, Valor) Between 0.10 And 0.58 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.49
    					When Valor - Convert(Int, Valor) Between 0.60 And 0.99 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.99
    					Else Valor
    				End
    
    Select * From #t_Valor

    No entanto, há alguns gaps na sua descrição, valores com decimal 00, 09 e 59 não serão atualizados. Porém você pode usar a mesma lógica para incluir esses casos, caso seja necessário.

    quarta-feira, 16 de maio de 2018 16:25

Todas as Respostas

  • Boa tarde, ABRÃOHITO!

    Segundo a descrição, você poderia usar um código semelhante a esse:

    Create Table #t_Valor
    (
    	Valor Decimal(10, 2)
    )
    
    Insert Into #t_Valor
    Values
    	(1.27) --1.49
    	,(1.68) --1.99
    	,(2.05) --1.99
    
    Select * From #t_Valor
    
    Update	#t_Valor
    Set		Valor = Case 
    					When Valor - Convert(Int, Valor) Between 0.01 And 0.08 Then Convert(Decimal(10, 2), Convert(Int, Valor)) - 0.01
    					When Valor - Convert(Int, Valor) Between 0.10 And 0.58 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.49
    					When Valor - Convert(Int, Valor) Between 0.60 And 0.99 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.99
    					Else Valor
    				End
    
    Select * From #t_Valor

    No entanto, há alguns gaps na sua descrição, valores com decimal 00, 09 e 59 não serão atualizados. Porém você pode usar a mesma lógica para incluir esses casos, caso seja necessário.

    quarta-feira, 16 de maio de 2018 16:25
  • BOA TARDE MAILSON,

    NÃO FUNCIONOU.

    TENTEI ASSIM.

    Update PRODUTO
    Set PRECO_VENDA = Case 
    When Valor - Convert(Int, Valor) Between 0.01 And 0.08 Then Convert(Decimal(10, 2), Convert(Int, Valor)) - 0.01
    When Valor - Convert(Int, Valor) Between 0.10 And 0.58 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.49
    When Valor - Convert(Int, Valor) Between 0.60 And 0.99 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.99
    Else Valor
    WHERE NOME LIKE 'TESTE ECF%'

    RESULTOU ESSE ERRO:

    Starting transaction...
    Preparing query: SELECT a.ID, a.ID_SAIDA, a.COMPROVANTE
    FROM SAIDA_COMPROVANTE a
    Prepare time: 0.016s
    Field #01: SAIDA_COMPROVANTE.ID Alias:ID Type:INTEGER
    Field #02: SAIDA_COMPROVANTE.ID_SAIDA Alias:ID_SAIDA Type:INTEGER
    Field #03: SAIDA_COMPROVANTE.COMPROVANTE Alias:COMPROVANTE Type:BLOB SUB_TYPE 1
    PLAN (A NATURAL)


    Executing...
    Done.
    7902 fetches, 0 marks, 581 reads, 0 writes.
    0 inserts, 0 updates, 0 deletes, 0 index, 3272 seq.
    Delta memory: 9496 bytes.
    Total execution time: 0.187s
    Script execution finished.
    Preparing query: Update PRODUTO
    Set PRECO_VENDA = Case 
    When Valor - Convert(Int, Valor) Between 0.01 And 0.08 Then Convert(Decimal(10, 2), Convert(Int, Valor)) - 0.01
    When Valor - Convert(Int, Valor) Between 0.10 And 0.58 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.49
    When Valor - Convert(Int, Valor) Between 0.60 And 0.99 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.99
    Else Valor
    WHERE NOME LIKE 'TESTE ECF%'
    Error: *** IBPP::SQLException ***
    Context: Statement::Prepare( Update PRODUTO
    Set PRECO_VENDA = Case 
    When Valor - Convert(Int, Valor) Between 0.01 And 0.08 Then Convert(Decimal(10, 2), Convert(Int, Valor)) - 0.01
    When Valor - Convert(Int, Valor) Between 0.10 And 0.58 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.49
    When Valor - Convert(Int, Valor) Between 0.60 And 0.99 Then Convert(Decimal(10, 2), Convert(Int, Valor)) + 0.99
    Else Valor
    WHERE NOME LIKE 'TESTE ECF%' )
    Message: isc_dsql_prepare failed

    SQL Message : -104
    Invalid token

    Engine Code    : 335544569
    Engine Message :
    Dynamic SQL Error
    SQL error code = -104
    Token unknown - line 3, column 22
    Int


    Total execution time: 0.015s


    sexta-feira, 18 de maio de 2018 15:10
  • Abrãohito, Bom dia!

    Esse foi apenas um exemplo do código. Para que ele funcione nessa tabela, você precisaria alterar o campo "Valor" pelo campo da tabela que você deseja atualizar (Aparentemente o campo "PRECO_VENDA"). No entanto, esse é um código T-SQL, ou seja, para que ele funcione deve ser executado em uma instância SQL Server.
    segunda-feira, 21 de maio de 2018 12:47