-
SQL - Wie bekomme ich die Genauigkeit hin?
Dieser SQL funktioniert wie erwartet:
select 367.4400/5.00 as EK from SYSIBM.sysdummy1;
Das Ergebnis ist 73.488!
Ich habe unter 7.3 im SQL folgendes Problem:
EKPR as (select POS,
HERK,
KALKZ,
sum(MENGE*EK) as SUMEK,
sum(MENGE) as SUMMENG,
case when sum(MENGE) != 0
then sum(EK*MENGE)/sum(MENGE)
end as EKPR
from POSB
group by POS,
HERK,
ALKZ),
REKPR as (select POIDPO,
HERK,
ALKZ,
EKPR,
SUMEK/SUMMENG as REKPR
from EKPR)
select * from REKPR
Das Ergebnis ist:
EKPR REKPR
73,48 73,48
Obwohl bei Abfrage auf EKPR
SUMEK : 367,4400 und
SUMMENG: 5,00
als Ergebnis geliefert wird.
Es sollte doch 73,488 zurückgeliefert werden! (siehe oben)
Woran kann das liegen?
Es ist egal ob ich die Abfrage im STRSQL absetze oder im RUNSQLSTM von Client Access Solution.
-
Wie sind die Feldtypen genau? Es werden in den Zwischenergebnissen z.T. große Felder erstellt, die dann relativ viele NK haben.
Bei der Division kann es dann zu Kürzungen der Nachkomma geben.
-
Also der Vergleichsoperant "!=" ist in SQL mit "<>" anzugeben.
Du hast in der CASE Anweisung auch ein ELSE.
Beides führt zu ungewolltem Verhalten.
lg Andreas
-
EK ist packed 9,2!
Ich habe die Lösung aber jetzt doch gefunden
float(sum(EK*MENGE))
Es ist dann egal ob ich in einer Rechnung dividiere oder erst hinterher.
-
Hi Andreas,
das != wird nur vom Greenscreen nicht akzeptiert, da müsste es ^= sein.
Aber ich glaube auch dass liegt am Zeichensatz.
LG Andreas
-
!= wird im IBM i SQL inzwischen wie <> behandelt.
Float ist ein schechter Cast da dieser nur 7-stellig genau ist. Double wäre da besser, da es 15 Stellen kann.
Zusätzlich wäre dann noch ein round(...) empfehlenswert.
-
Danke für den Hinweis auf double. Für den round() mach ich das Ganze , da vorher die Ergebnisse auf 2 Stellen abgeschnitten wurden und somit bei 73.488 nur 73.48 anstatt 73.49 raus kam.
-
Das Problem ist, dass für die Summenfelder ggf. das Maximum als Zwischenergebnis verwendet wird, also Dec(31, 2).
Bei Dec(31, 2) / Dec(31, 2) gibt es leider zu wenig Nachkommastellen.
Wenn man allerdings weiß, dass die Summe nicht größer als 15 Stellen haben wird, ist es besser diese zu casten, also dec(sum(....), 15, 2).
Dann klappt es auch mit der Division. Vorteil: Double ist im Nachkommabereich relativ ungenau.
Nachtrag zur Performance:
case when sum(MENGE) != 0
then sum(EK*MENGE)/sum(MENGE)
end as EKPR
ersetzen durch:
sum(EK*MENGE)/nullif(sum(MENGE), 0) as EKPR
-
Habe ich dann im EKPR, wenn die sum(Menge) = 0 ist, als Ergebnis 0 oder null?
-
Da dein Case keinen Else hat ist da auch das Ergebnis NULL.
Wenn du im Ergebnis 0 brauchst, dann geht das wiederum so:
coalesce( sum(EK*MENGE) / nullif(sum(MENGE), 0), 0 ) as EKPR
-
Danke für die Hilfe!
Ich benötige null um diese Sätze gezielt auszuschließen von der Verarbeitung.
Mit deiner Antwort und dem Nachlesen in der SQL-Referenz, bin ich mir jetzt sicher.
-
Nachlesen hilft immer;-).
Similar Threads
-
By ILEMax in forum IBM i Hauptforum
Antworten: 15
Letzter Beitrag: 25-07-17, 11:10
-
By KingofKning in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 24-12-14, 11:10
-
By gize in forum NEWSboard Drucker
Antworten: 6
Letzter Beitrag: 22-02-05, 06:48
-
By Miles in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 13-10-03, 19:47
-
By Arbi in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 22-09-01, 10:13
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks