PDA

View Full Version : Rechnen mit SQL



Peet
24-10-13, 18:35
Hallo zusammen,

ich muss mit SQL rechnen und führe dabei verschiedene
Befehle aus, bis auf einen klappt das auch wunderbar !

Folgende Rechenformel macht mich "fertig"...:confused:

select cast( 9920 /12000 * 145000 as decimal(13,0) ) as wert from datei where feld=1

Ich habe schon die verschiedensten "Klammern" gesetzt, habe auch über "Punkt vor Strichrechnung" nachgedacht und die Formel vom Ursprung ((12000-2080)/12000 * 145000) auf den o.g. Wert geändert...
ABER es kommt immer 0 raus !!!!!

Lt. "Windows calc" und "Excel" müsste aber 119866,666666 rauskommen !

In Excel lautet die Formel "=(E2-E3)/E2*B2", wobei die Zellen..
E2 = 12000
E3 = 2080
B2 = 145000
die gezeigten Werte haben ! !

Hat irgend jemand einen Tipp oder vielleicht sogar die Lösung ?

Vielen Dank im Voraus !
Peet

malzusrex
24-10-13, 18:57
Tag auch,

versuhe mal im STRSQL


values((12000,0-2080)/12000*145000)


Da solltest du dein Ergebnis erhalten


Gruß
Ronald

Peet
24-10-13, 20:46
Vielen Dank !

Aber ich kriege es leider nicht hin oder stehe gerade auf dem Schlauch :eek:

Kannst du mir den SQL-Befehl vollständig darstellen ??
Zumindest den "select ....." bis "from" ?

Vielen Dank im Voraus !
Peet

KM
25-10-13, 06:22
Hallo,

das hat mit den Typen und Längen der Zwischenergebnisse zu tun. Probier mal folgendes:


select cast(cast((12000 - 2080) as decimal(13 , 5)) / cast(12000 as decimal(13 , 5)) * 145000 as decimal(13 , 0)) as wert from sysibm.sysdummy1

Gruß,
KM

malzusrex
25-10-13, 07:01
Du brauchst nur das was in den Klammer von Values stehen in dein Selcect einfügen.
oder eben meine Zeile ohne irgend etwas anderes im STRSQL eingeben. Da sollte dann schon dein Ergebnis kommen.
Die Antwort von KM sieht natürlich auch elegant aus und liefert dir dein Ergebnis.

Gruß
Ronald

B.Hauser
25-10-13, 08:28
Die Erklärung ist ganz einfach!

Besteht eine Rechnung aus 2 Integer-Werten, ist das Ergebnis wieder ein Integer-Wert (so lautet die Regel und nicht nur in SQL bzw. auf der IBM i).
Da für 9920, 12000 und 145000 keine Nachkommastellen angegeben wurden, werden diese Werte als Integer-Werte behandelt.


9920 / 12000 = 0,8266666...

Da das Ergebnis jedoch wieder ein Integer-Wert ist, werden die Nachkommastellen abgeschnitten, d.h. statt 0,826... mit 0 weitergerechnet.

Werden bei einer Zahl Nachkommastellen angegeben, so wird diese nicht mehr als Integer erkannt, sondern als Fließkomma interpretiert und das Ergebnis ist wiederum ein Fließkomma-Wert.

Du hast also die Möglichkeit die einzelnen Werte explizit z.B. auf Dezimal zu casten, oder einfach die erste Zahl mit 0 Nachkommastellen angeben:


9920,0 / 12000

Natürlich sollte man die Reihenfolge beachten, wird 145000 als Fließkomma interpretiert und die anderen beiden Werte als Integer, ist das Kind bereits in den Brunnen gefallen. Da keine Klammern gesetzt wurden wird zunächst 9920 / 12000 dividiert, und das Ergebnis (0) mit 145000 multipliziert. 0 * irgendwas = 0.

Ich gehe jedoch davon aus, dass dies nur ein Test war und die Spalten in der Datei nicht als Integer-Werte definiert sind, sondern als gepackte oder gezonte numerische Werte.

Kleiner Tipp, ich würde die Division immer am Ende durch führen, also:


9920,0 * 145000 / 12000

Birgitta

Fuerchau
25-10-13, 09:35
Ich nehme mal an, dass die Konstanten ggf. nur Beispiele sind und ggf. auch aus Feldern kommen.
Sind die Felder Ganzzahl und man möchte Nachkomma, so ist wenigstens ein Feld mit Nachkomma zu casten:

dec(F1, 11, 2) / dec(F2, 11, 2) * dec(F3, 11, 2)

Wichtig ist, dass ggf. Zwischenschritte gerundet werden sollten, da SQL u.U. abschneidet, z.B.:

round(dec(F1, 11, 2) / dec(F2, 11, 2), 2) * dec(F3, 11, 2)

Peet
25-10-13, 11:50
Vielen Dank an Alle !

Jetzt habe ich es "hingekriegt" ;)

Und an Britta den "erweiterten" Dank für die zusätzlichen "ausführenden" Erklärungen !!!

Weiterhin viel Erfolg und ein schönes Wochenende !!

Gruß
Peet