Anmelden

View Full Version : SQL - Insert mit select berechnung eines Wertes



Seiten : [1] 2 3

nico1964
09-02-16, 07:11
Hallo,

wie kriege ich aus folgenden werden mittels select einen vernünftigen wert für ein insert?

select sum(((t67.lgdcov /100 * expeigcov) +
(t67.lgduncov /100 * expeigunco)) /
(expeigcov + expeigunco - zussisum))
from lea/leadwht1, lea/leat67 t67

Felddef: lgd* Numeric 5, 2
alle anderen Decimal 13, 2

das Ergebnis soll Numeric 8,7 sein
Vielen Dank im voraus
Andreas

KingofKning
09-02-16, 07:22
Schau Dir doch mal die DEC Funktion an.

GG

nico1964
09-02-16, 07:50
Erfolgreich herumprobiert und das am Faschingdienstag gggg

select
((decimal(expeigcov * double(t67.lgdcov)/100, 13 , 2) +
decimal(expeigunco * double(t67.lgduncov)/100, 13 , 2)) /
(expeigcov + expeigunco - zussisum))

bringt mir als Ergebnis


0,39999999986143126


Gruss aus Wien

B.Hauser
09-02-16, 07:56
Wenn Du bei der Funktion DEC/DECIMAL, weder Länge noch Nachkommastellen angibst, woher soll er wissen, dass Du 8, 7 (wobei ich auf mindestens 11, 7 gehen würde) willst?

ggf. kannst Du noch auf 7 Stellen mit Funktion ROUND kaufmännisch runden.

Birgitta

nico1964
09-02-16, 08:12
Wenn Du bei der Funktion DEC/DECIMAL, weder Länge noch Nachkommastellen angibst, woher soll er wissen, dass Du 8, 7 (wobei ich auf mindestens 11, 7 gehen würde) willst?

ggf. kannst Du noch auf 7 Stellen mit Funktion ROUND kaufmännisch runden.

Birgitta
Hallo Birgitta,

könntest Du mir dabei bitte helfen, damit ich das Ergebnis auf 8, 7 kriege, den ich bekomme jetzt
einen Überlauf wie du richtig angemerkt hast.
Rechne zum ersten mal mehr als nur summen oder Subtraktion mit SQL bin ein alter COBOL-Programmierer und alt im sprichwörtlichen Sinn.

LG
Andreas

KingofKning
09-02-16, 08:21
Ist zwar Microsoft, funktionier aber auch unter AS/400.

https://msdn.microsoft.com/de-de/library/ms187746%28v=sql.120%29.aspx
(https://msdn.microsoft.com/de-de/library/ms187746%28v=sql.120%29.aspx)
Alternativ:
http://www-01.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/com.ibm.db2z10.doc.sqlref/src/tpc/db2z_bif_decimal.dita

In Summe: dec(10, 2) = 10 Stellen davon 2 Nachkomma.

GG

Fuerchau
09-02-16, 08:36
Du musst die Funktion um deine Summe packen:
dec(sum(...), 15, 7)

Beachte dabei, dass das Ergebnis abgeschnitten wird, ggf. mach noch einen Round im Dec:
dec(round(sum(...), 7), 15, 7)

Beachte auch, dass es zu einem SQL-Fehler kommt, wenn das Ergebnisi > 8 Stellen vor dem Komma wird.

nico1964
09-02-16, 09:39
Du musst die Funktion um deine Summe packen:
dec(sum(...), 15, 7)

Beachte dabei, dass das Ergebnis abgeschnitten wird, ggf. mach noch einen Round im Dec:
dec(round(sum(...), 7), 15, 7)

Beachte auch, dass es zu einem SQL-Fehler kommt, wenn das Ergebnisi > 8 Stellen vor dem Komma wird.

ich habe das DEC(....), 8, 7) eingebaut, was mir folgende Einzelergebnisse vereinfacht dargestellt liefert:
1. Berchnung 2. Berechnung 3.Berechung
5.000.000,00 + 0,80 / 15.000.000,00
wobei 1. Berechnung und 2. Berechung zusammen und 3.Berechnung alleine max. 99.999.999,99 ergeben können und 1 + 2 / 3 maximal 1,0000000

und bekomme jetzt folgenden Fehler


Nachrichten-ID . . . . : SQL0406 Bewertung . . . . . . : 30
Nachrichtenart . . . . : Diagnose
Sendedatum . . . . . . : 16.02.09 Sendezeit . . . . . . : 09:49:01

Nachricht . . . : Umsetzungsfehler bei der Zuordnung zu Spalte LGD_COV.
Ursache . . . . : Bei dem Versuch, Spalte LGD_COV mit einer Anweisung
INSERT, UPDATE, ALTER TABLE oder REFRESH TABLE einen Wert zuzuordnen, ist
ein Umsetzungsfehler der Art 1 aufgetreten. Wurde eine Vorkompilierung
durchgeführt, ist der Fehler aufgetreten, als eine numerische Konstante in
dieselben Attribute wie Spalte LGD_COV umgesetzt werden sollte. Mögliche
Fehlerarten sind:
-- Fehlerart 1 - Überlauf.
-- Fehlerart 2 - Gleitkommaüberlauf.
-- Fehlerart 3 - Gleitkommaunterlauf.
-- Fehlerart 4 - Gleitkommaumsetzungsfehler.

Wenn ich den Aufruf native ausführe bekomme ich für die Berechnung folgendes Ergebnis(auszugsweise):

Ausdruck CASE
2.512.556,6900000000000000
289.699,7500000000000000
91.641,2900000000000000
3.894.073,4600000000000000
360.586,9500000000000000
5.436.586,2500000000000000
2.633.054,1000000000000000
10.516.225,7000000000000000
16.044.414,2000000000000000
2.674.854,3700000000000000
4.499.917,6500000000000000

und hier noch der aktuelle auszug aus dem sqlstatement
dec(((decimal(dwht1.expeigcov * double(t67.lgdcov)/100, 13 , 2) +
decimal(dwht1.expeigunco * double(t67.lgduncov)/100, 13 , 2)) /
(dwht1.expeigcov + dwht1.expeigunco - dwht1.zussisum)), 8, 7),

Fuerchau
09-02-16, 10:07
dec(Ausdruck, 8, 7) = 8 Stellen, davon 7 Nachkomma
deshalb
dec(Ausdruck, 15, 7) = 15 Stellen, davon 7 Nachkomma, also 8 Vorkomma

nico1964
09-02-16, 11:05
dec(Ausdruck, 8, 7) = 8 Stellen, davon 7 Nachkomma
deshalb
dec(Ausdruck, 15, 7) = 15 Stellen, davon 7 Nachkomma, also 8 Vorkomma

geändert aber leider der selbe Fehler, bin kurz vor dem verzweifeln oder ich sehe den Wald vor lauter Bäumen nicht mehr