2009-11-09 16 views
8

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

+1

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

Odpowiedz

17
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

+0

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

11

Rozwiązanie ogóle matematyka:

Dzielenie przez 5, okrągłe do najbliższej liczby całkowitej, a następnie pomnożyć przez 5.

-8

Zastosowanie ROUND funkcja

SELECT ROUND(FineAmount,5) 
    FROM tickets 
+1

Wartość całkowita w przeciążeniu typu "ROUND" ma wskazywać dokładność dziesiętną, a nie wielokrotność do zaokrąglenia. – paqogomez

0
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

2

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

+0

Należy zauważyć, że "Typ danych float danych jest niepoprawny dla operatora modulo" –

+0

Ale 10 zaokrągleń jest 10- (10% 5) +5 = 15, ale powinno wynosić 10. – Marichyasana

0

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