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?


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)

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

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)

27

verwenden

select 1/3.0

Dies wird den Job machen.


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 .


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

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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.