Mam kolumnę Money w mojej tabeli SQL Server 2008. W moim poniższym zapytaniu w jaki sposób można zaokrąglić go do najbliższej $ 5Zaokrąglanie do najbliższych 5 w SQL Server
select FineAmount from tickets
Dzięki
Mam kolumnę Money w mojej tabeli SQL Server 2008. W moim poniższym zapytaniu w jaki sposób można zaokrąglić go do najbliższej $ 5Zaokrąglanie do najbliższych 5 w SQL Server
select FineAmount from tickets
Dzięki
select round(FineAmount*2,-1)/2 from tickets
lub umieścić nicholaides sugestię w sql
select round(FineAmount/5,0)*5 from tickets
W przykładzie założono, że FineAmount jest typu pieniędzy. Drugie podejście jest chyba lepiej jako pierwszy współpracuje z limitem maximum_value_of_money_type/2
Więcej na ROUND
Jedyną uwagą, którą dodaję do tego, jest to, że dzieli 5 jako liczbę dziesiętną, a nie na liczbę całkowitą. możesz zawinąć go w konwertowanie/rzutowanie lub dodać do niego 0, aby upewnić się, że działa poprawnie. np. wybierz rundę (FineAmount/5.0,0) * 5 z biletów – Sam
Rozwiązanie ogóle matematyka:
Dzielenie przez 5, okrągłe do najbliższej liczby całkowitej, a następnie pomnożyć przez 5.
Zastosowanie ROUND funkcja
SELECT ROUND(FineAmount,5)
FROM tickets
Wartość całkowita w przeciążeniu typu "ROUND" ma wskazywać dokładność dziesiętną, a nie wielokrotność do zaokrąglenia. – paqogomez
DECLARE @Amount DECIMAL(18,3) ; SET @Amount = 7818.32
SELECT(Round((@Amount-CAST(@Amount AS INT))*100 /5,0)*5 /100)
+ CAST(@Amount AS INT)
- dostaniesz 7818.30
Jeśli chcesz obcięcie (zaokrąglenie w dół) do grupy 5 używa funkcji modulo; Microsoft SQL Server to %
tj field1
- (field1
% 5)
Jeśli miał pole1 == 3, a następnie oblicz byłoby:
3 - (3% 5) = 0
gdyby było 13:
13 - (13% 5) = 10
Wystarczy dodać 5, jeśli chcesz zaokrąglić w górę
Zobacz również 'MOD' is not a recognized built-in function name
Należy zauważyć, że "Typ danych float danych jest niepoprawny dla operatora modulo" –
Ale 10 zaokrągleń jest 10- (10% 5) +5 = 15, ale powinno wynosić 10. – Marichyasana
Moje pierwsze rozwiązanie było
create function dbo.udf_RoundToNearest(@x int, @to int)
returns int
with schemabinding as begin
return @to * convert(int, round(convert(float, @x)/convert(float, @to), 0))
end
To działa, ale jest uważany przez MSSQL jako „nieprecyzyjny” ponieważ używa liczb zmiennoprzecinkowych wewnętrznie. To zatrzymuje je w widokach indeksowanych. Zamiast tego można wykonać zadanie tylko z arytmetyczną liczbą całkowitą:
create function dbo.udf_RoundToNearest(@x int, @to int)
returns int
with schemabinding as begin
declare @m int
set @m = abs(@x) % abs(@to)
declare @trunc int
set @trunc = abs(@x) - @m
declare @r int
set @r = case when @m * 2 >= abs(@to) then @trunc + abs(@to) else @trunc end
return case when @x < 0 then [email protected] else @r end
end
Czy można zdefiniować "najbliższy"? Tj. Jaki wynik chcesz uzyskać dla wartości 0, 1, 2.5 i 4? Zaokrąglanie pieniędzy może oznaczać różne rzeczy w zależności od przypadku użycia. – richardtallent