Jak uzyskać wynik zmiennoprzecinkowy, dzieląc dwie wartości całkowite za pomocą T-SQL?

173

Używając T-SQL i Microsoft SQL Server, chciałbym określić liczbę cyfr dziesiętnych, gdy wykonuję podział między 2 liczbami całkowitymi, takimi jak:

select 1/3

To obecnie powraca 0. Chciałbym, żeby wrócił 0,33.

Coś jak:

select round(1/3, -2)

Ale to nie działa. Jak mogę osiągnąć pożądany efekt?

LaBracca
źródło
3
Czy próbowałeś 1.0 / 3?
Thilo
Odpowiedzi, które otrzymałem, są więcej niż wystarczające
LaBracca

Odpowiedzi:

277

Sugestie od stb i xiowl są w porządku, jeśli szukasz stałej. Jeśli chcesz użyć istniejących pól lub parametrów, które są liczbami całkowitymi, możesz najpierw rzutować je na liczby zmiennoprzecinkowe:

SELECT CAST(1 AS float) / CAST(3 AS float)

lub

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)
Richard
źródło
Możesz też rzucić je jako ułamki dziesiętne, jeśli chcesz uzyskać wynik dziesiętny.
Tim
30
SELECT 1.0 * MyInt1 / MyInt2
Troglo
@TroubleZero do użytku z MySQLdecimal
itsazzad
wielkie dzięki, uratowałeś mi dzień. Próbowałem CAST (7/3 AS float), ale ponownie zwróciłem 2. Więc rzucanie liczb rozwiązało mój problem.
Yasin Yörük
3
nie ma potrzeby rzutowania zarówno dywidendy, jak i dzielnika, zobacz odpowiedź stackoverflow.com/a/30639343/2866644
@MS
70

Ponieważ SQL Server wykonuje dzielenie liczb całkowitych. Spróbuj tego:

select 1 * 1.0 / 3

Jest to przydatne, gdy przekazujesz liczby całkowite jako parametry.

select x * 1.0 / y
xiaowl
źródło
1
Możesz nawet pominąć zera.
John
43

Nie trzeba rzucać ich obu. Typ danych wyniku dla podziału jest zawsze taki, który ma wyższy priorytet typu danych . Zatem rozwiązanie musi być:

SELECT CAST(1 AS float) / 3

lub

SELECT 1 / CAST(3 AS float)
SM
źródło
27

posługiwać się

select 1/3.0

To wystarczy.

stb
źródło
13

Rozumiem, że CASTprzejście do FLOATnie jest dozwolone w MySQL i spowoduje wyświetlenie błędu, gdy spróbujesz, CAST(1 AS float)jak podano w MySQL dev .

Obejście tego problemu jest proste. Po prostu zrób

(1 + 0.0)

Następnie użyj, ROUNDaby uzyskać określoną liczbę miejsc dziesiętnych, takich jak

ROUND((1+0.0)/(2+0.0), 3)

Powyższy kod SQL dzieli 1 na 2 i zwraca liczbę zmiennoprzecinkową do 3 miejsc po przecinku, tak jak by to było 0.500.

Można CASTdo następujących typów: binary, char, date, datetime, decimal, json, nchar, signed, time i unsigned .

Supreme Dolphin
źródło
3
MySQL pozwala CAST, po prostu nie pozwala na przesyłanie FLOAT. DECIMALZamiast tego przesyłaj do . Zobacz np . Stackoverflow.com/questions/7368163/… .
markusk
7

Wygląda na to, że ta sztuczka działa w SQL Server i jest krótsza (na podstawie poprzednich odpowiedzi)

SELECT 1.0*MyInt1/MyInt2

Lub:

SELECT (1.0*MyInt1)/MyInt2
Troglo
źródło
2
Najbardziej podobało mi się to, nawet ładnie wygląda do obliczeń procentowych:SELECT 100.0 * @Elapsed / @Total
EliSherer
3

Użyj tego

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

Tutaj w tym sql najpierw przekonwertuj na liczbę zmiennoprzecinkową lub pomnóż przez 1,00. Który wynik będzie liczbą zmiennoprzecinkową. Tutaj rozważam 2 miejsca dziesiętne. Możesz wybrać to, czego potrzebujesz.

nazmul.3026
źródło
2

Jeśli przyszedłeś tutaj (tak jak ja), aby znaleźć rozwiązanie dla wartości całkowitej , oto odpowiedź:

CAST(9/2 AS UNSIGNED)

zwraca 5

trojański
źródło