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 ROUND
te 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 amount
een 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>[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
Parameterdefinitie:
- @Number – het getal dat je moet afronden
- @RoundNearest 10e, 100e, 1000e etc
- @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