Afronden *UP* naar de dichtstbijzijnde 100 in SQL Server

Is het mogelijk om een ​​getal gemakkelijk naar bovenaf te ronden naar de dichtstbijzijnde 100 (of 1000, 500, 200 etc.) in SQL Server?

Dus:

720 -> 800
790 -> 800
1401 -> 1500


Antwoord 1, autoriteit 100%

Het volgende zou moeten werken. Na het lezen van uw vraag, weet ik niet precies wat u 100 wilt retourneren. Voor deze 100 geeft 100 terug.

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

Dit geeft de volgende resultaten:

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

Antwoord 2, autoriteit 87%

Probeer het volgende om naar boven af ​​te ronden op het dichtstbijzijnde duizendtal:-

select round(YourValue, -3)

Antwoord 3, autoriteit 43%

Een optie zou zijn om de functie CEILING()te gebruiken, zoals dit:

SELECT CEILING(@value/100.0) * 100

Het kan zijn dat u uw waarde eerst naar een decimaal moet converteren, afhankelijk van het type.


Antwoord 4, autoriteit 13%

Gebruik de functie PLAFOND om een ​​getal naar boven af ​​te ronden

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

Antwoord 5, autoriteit 5%

Het is heel eenvoudig om een ​​getal af te ronden op een veelvoud van de dichtstbijzijnde 10 door simpelweg de functie ROUNDte gebruiken
bijvoorbeeld:

SELECT ROUND(number/1000,2)*1000 

Dit geeft je de dichtstbijzijnde duizendste waarde.


Antwoord 6, autoriteit 3%

Probeer dit:

selecteer ronde(@value , -2);


Antwoord 7

Er is geen native functie die dit kan, maar er zijn een aantal eenvoudige wiskundige trucs die dat wel kunnen. Een voorbeeld:

DECLARE @Foo int
SET @Foo = 720
print @Foo
print (@Foo + 100) % 100
PRINT @Foo - (@Foo + 100) % 100

Antwoord 8

U kunt deze code gebruiken, ervan uitgaande dat uw amounteen int is. Zo niet, dan moet je casten, zodat je een integer-deling krijgt.

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

Misschien wil je dit verpakken in een door de gebruiker gedefinieerde functie .


Antwoord 9

Een generieke oplossing – Gebruik MOD om de laatste 100e plaats te vinden en voeg vervolgens 100 toe aan het resultaat.

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

Als je de volgende 80e plaats nodig hebt, vervang dan een willekeurige “100” door “80”.


Antwoord 10

Naast het antwoord van Gray’santwoord,
Ik zou de volgende inline-functie gebruiken:

CREATE FUNCTION dbo.udf_RoundNearest
(
@Number bigint,
@RoundNearest bigint,
@Direction int
)
RETURNS TABLE AS 
RETURN
SELECT CASE WHEN @RoundNearest>=@Number 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

Parameterdefinitie:

  1. @Number – het getal dat je moet afronden
  2. @RoundNearest 10e, 100e, 1000e etc
  3. @Richting 0-> rondnaar beneden, 1-> naar boven afronden

met behulp van de functie:

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

het kan ook worden gebruikt als toepassing versus een tabel
zoals:

;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*/

Antwoord 11

Dit werkt ook voor de waarden met decimalen.

select floor((ceiling (@value) + 99) / 100) * 100;


Antwoord 12

Dit werkte prima voor mij.

Round(@value/100, 0) * 100


Antwoord 13

Het werkt prima voor integerwaarde:

@roundUpValue = ((@intValue / 1000) + 1) * 1000
@roundDownValue = (@intValue / 1000) * 1000

Bijvoorbeeld

declare @intValue as int = 1934
select ((@intValue / 1000) + 1) * 1000 as roundUp
select (@intValue / 1000) * 1000 as roundDown

Als u wilt afronden naar de dichtstbijzijnde 500, dan

select ((@intValue / 500) + 1) * 500 as roundUp

Other episodes