Wie erhalte ich ein Float-Ergebnis, indem ich zwei ganzzahlige Werte mit T-SQL teile?

172

Mit T-SQL und Microsoft SQL Server möchte ich die Anzahl der Dezimalstellen angeben, wenn ich eine Division zwischen 2 Ganzzahlen wie:

select 1/3

Das kehrt derzeit zurück 0. Ich möchte, dass es zurückkommt 0,33.

Etwas wie:

select round(1/3, -2)

Das geht aber nicht Wie kann ich das gewünschte Ergebnis erzielen?

LaBracca
quelle
3
Haben Sie 1.0 / 3 ausprobiert?
Thilo
Die Antworten, die ich bekam, sind mehr als genug
LaBracca

Antworten:

276

Die Vorschläge von stb und xiowl sind in Ordnung, wenn Sie nach einer Konstanten suchen. Wenn Sie vorhandene Felder oder Parameter verwenden müssen, bei denen es sich um Ganzzahlen handelt, können Sie diese zuerst in Gleitkommazahlen umwandeln:

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

oder

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)
Richard
quelle
Oder Sie können sie als Dezimalstellen umwandeln, wenn Sie ein Dezimalergebnis wünschen.
Tim
30
SELECT 1.0 * MyInt1 / MyInt2
Troglo
@ TroubleZero für MySQL verwendendecimal
itsazzad
Vielen Dank, du hast meinen Tag gerettet. Ich habe CAST (7/3 AS float) ausprobiert, aber wieder 2 zurückgegeben. Also Besetzungszahlen ist mein Problem gelöst.
Yasin Yörük
3
Keine Notwendigkeit, sowohl Dividende als auch Divisor zu werfen, siehe @ MS 'Antwort stackoverflow.com/a/30639343/2866644
robotik
69

Weil SQL Server eine Ganzzahldivision durchführt. Versuche dies:

select 1 * 1.0 / 3

Dies ist hilfreich, wenn Sie Ganzzahlen als Parameter übergeben.

select x * 1.0 / y
Xiaowl
quelle
1
Sie können sogar die Nullen weglassen.
John
43

Es ist nicht notwendig, beide zu besetzen. Der Ergebnisdatentyp für eine Division ist immer derjenige mit der höheren Priorität für den Datentyp . Die Lösung muss also sein:

SELECT CAST(1 AS float) / 3

oder

SELECT 1 / CAST(3 AS float)
MS
quelle
27

verwenden

select 1/3.0

Dies wird den Job machen.

stb
quelle
13

Ich verstehe, dass CASTing to FLOATin MySQL nicht erlaubt ist und einen Fehler auslöst, wenn Sie versuchen, CAST(1 AS float)wie in MySQL dev angegeben .

Die Problemumgehung ist einfach. Mach einfach

(1 + 0.0)

Verwenden Sie dann ROUND, um eine bestimmte Anzahl von Dezimalstellen wie zu erreichen

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

Die obige SQL dividiert 1 durch 2 und gibt einen Gleitkommawert auf 3 Dezimalstellen zurück, wie es der Fall wäre 0.500 .

Man kann CASTdie folgenden Typen wählen : binär, char, Datum, Datum / Uhrzeit, dezimal, json, nchar, signiert, Uhrzeit und ohne Signatur .

Oberster Delphin
quelle
3
MySQL erlaubt CAST, es erlaubt nur kein Casting FLOAT. Cast to DECIMALstattdessen. Siehe z . B. stackoverflow.com/questions/7368163/… .
Markusk
7

Dieser Trick funktioniert anscheinend in SQL Server und ist kürzer (basierend auf früheren Antworten).

SELECT 1.0*MyInt1/MyInt2

Oder:

SELECT (1.0*MyInt1)/MyInt2
Troglo
quelle
2
Mir hat das am besten gefallen, es sieht sogar gut aus für prozentuale Berechnungen:SELECT 100.0 * @Elapsed / @Total
EliSherer
3

Benutze das

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

Hier in diesem SQL konvertieren Sie zuerst in Float oder multiplizieren Sie mit 1,00. Diese Ausgabe ist eine Float-Zahl. Hier betrachte ich 2 Dezimalstellen. Sie können wählen, was Sie brauchen.

nazmul.3026
quelle
2

Wenn Sie hierher gekommen sind (genau wie ich), um die Lösung für den ganzzahligen Wert zu finden , ist hier die Antwort:

CAST(9/2 AS UNSIGNED)

gibt 5 zurück

Trojaner
quelle