2010-07-08 20 views

risposta

35

Quanto segue dovrebbe funzionare. Dopo aver letto la tua domanda, non sono esattamente sicuro di ciò che vuoi restituire. Per questo 100 restituisce 100.

select floor((X + 99)/100) * 100; 

Questo dà i seguenti risultati:

0 -> 0 
1 -> 100 
99 -> 100 
100 -> 100 
101 -> 200 
+0

Ho bisogno di qualcosa se C# fa la stessa cosa, e la formula sopra funziona bene. L'unico piccolo problema è che non funziona se X è un negativo. Il modo in cui l'ho risolto (non completamente sicuro della sintassi SQL, ma dovrebbe essere facile da capire) era assicurarsi che X fosse sempre positivo (Abs (X)) e quindi moltiplicare per -100. –

+0

Mi dispiace dirlo, ma questa risposta sembra funzionare solo per valori interi. X = 100.25 restituisce 100 invece di arrotondare a 200. @ La risposta del soffitto di Krock funziona meglio per i galleggianti e i decimali – bmadtiger

14

Una possibilità sarebbe quella di utilizzare la funzione CEILING() in questo modo:

SELECT CEILING(@value/100.0) * 100 

Potrebbe essere necessario convertire prima il valore in decimale, a seconda del tipo.

+0

Questo è ovviamente la migliore risposta – ministry

+0

Questo non sempre arrotonda * SU *, come specificato nella domanda. Per esempio 'SELECT ROUND (129.0/100, 0) * 100' restituisce 100 invece di 200. – Gyromite

+0

@Gyromite strano che il sito web che ho collegato fosse corretto, ma devo averlo copiato male:/ – krock

0

Non c'è alcuna funzione nativa che lo faccia, ma ci sono un numero qualsiasi di trucchi matematici semplici che lo faranno. Un esempio:

DECLARE @Foo int 
SET @Foo = 720 

print @Foo 
print (@Foo + 100) % 100 
PRINT @Foo - (@Foo + 100) % 100 
+0

Questo non sempre è rotondo * SU *, come specificato nella domanda. L'esempio con 720 come input dovrebbe restituire 800, ma invece restituisce 700. – Gyromite

0

È possibile utilizzare questo codice, supponendo che il amount è un int. In caso contrario, sarà necessario eseguire il cast, in modo da ottenere la divisione intera.

If amount % 100 != 0 Then 
    roundedAmount = ((amount/100) * 100) + 100 
Else 
    roundedAmount = amount 

Si potrebbe desiderare di confezionare questo in un user defined function.

7

Utilizzare la funzione SOFFITTO per arrotondare una figura fino

DECLARE @Number DECIMAL, @RoundUp DECIMAL 
SET @RoundUp = 100 
SET @Number = 720 
SELECT CEILING(@Number/@RoundUp)*@RoundUp 
17

per arrotondamento al migliaio più vicino, prega provare quanto segue: -

select round(YourValue, -3) 

Saluti !!!!!

+0

Questo round down, non attivo. Provalo. selezionare round (1005, -3) --risultare: 1000 – Sameer

0

Una soluzione generica: utilizzare MOD per trovare l'ultimo 100 ° posto e quindi aggiungere 100 al risultato.

select (720 - MOD(720,100)) + 100 from dual; 

Se è necessario il prossimo 80 ° posto, basta sostituire qualsiasi "100" con "80".

+0

C'è un problema con questa formula quando il valore di input è già un multiplo di 100. 'select (800 - (800% 100)) + 100;' darà 900 anziché 800. – Gyromite

3

Prova questo:

selezionare round (@value, -2);

+0

Questo non sempre arrotonda * SU *, come specificato nella domanda. Ad esempio 'select round (129.0, -2);' restituisce 100 invece di 200. – Gyromite

0

è molto semplice per arrotondare un numero a qualsiasi multiplo di più vicino 10 utilizzando semplicemente la funzione ROUND es:

SELECT ROUND(number/1000,2)*1000 

Questo vi darà il valore millesimo.

0

Oltre a Gray's risposta, userei la seguente funzione inline:

CREATE FUNCTION dbo.udf_RoundNearest 
(
@Number bigint, 
@RoundNearest bigint, 
@Direction int 
) 

RETURNS TABLE AS 
RETURN 

SELECT CASE WHEN @RoundNearest>[email protected] THEN @Number 
     ELSE 
     (
       (@Number + CASE 
          WHEN @Direction = 0 --Round Down 
          THEN 0 
          ELSE CASE WHEN @Number % @RoundNearest = 0 THEN 0 ELSE @RoundNearest END 
          END)/@RoundNearest) * @RoundNearest 

    END Number 

Parametro Definizione:

  1. @number - il numero è necessario arrotondare
  2. @RoundNearest 10, 100, 1000 ecc.
  3. @Direction 0-> roundgiù, 1-> arrotondare

utilizzando la funzione di:

SELECT * FROM dbo.udf_RoundNearest (1965,100,1) --> 2000 
SELECT * FROM dbo.udf_RoundNearest (1359,100,0) --> 1300 
SELECT * FROM dbo.udf_RoundNearest (1999,10,0) --1990 
SELECT * FROM dbo.udf_RoundNearest (80,100,0) --> 80 (if the @number parameter is less or equal the @RoundNearest parameter the result will be the @number itself 

può essere utilizzato anche come applicarla contro un tavolo come ad esempio:

;with tmp (Value) as 
    (select 1236 union all select 6584 union all select 9999) 

    select t.*, fn.Number 
    from tmp t 
    cross apply dbo.udf_RoundNearest (Value,100,0) fn 

    /*Result Set 
    Value Number 
    1236 1200 
    6584 6500 
    9999 9900*/