[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Mar 2019
    Beiträge
    33

    Question 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.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Nov 2020
    Beiträge
    315
    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

  4. #4
    Registriert seit
    Mar 2019
    Beiträge
    33
    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.

  5. #5
    Registriert seit
    Mar 2019
    Beiträge
    33
    Hi Andreas,
    das != wird nur vom Greenscreen nicht akzeptiert, da müsste es ^= sein.
    Aber ich glaube auch dass liegt am Zeichensatz.
    LG Andreas

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    != 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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Mar 2019
    Beiträge
    33
    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.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    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
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Mar 2019
    Beiträge
    33
    Habe ich dann im EKPR, wenn die sum(Menge) = 0 ist, als Ergebnis 0 oder null?

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    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
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Mar 2019
    Beiträge
    33
    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.

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Nachlesen hilft immer;-).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Warum bekomme ich mal ein joblog, mal nicht
    By ILEMax in forum IBM i Hauptforum
    Antworten: 15
    Letzter Beitrag: 25-07-17, 12:10
  2. Ja wo laufen sie denn, Ja wo laufen sie denn hin
    By KingofKning in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 24-12-14, 12:10
  3. wie bekomme ich verschiedene Schriften auf 1 Seite
    By gize in forum NEWSboard Drucker
    Antworten: 6
    Letzter Beitrag: 22-02-05, 07:48
  4. Wie bekomme ich eine SAVF auf die AS400
    By Miles in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 13-10-03, 20:47
  5. Was ******SE und wo bekomme ich es??
    By Arbi in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 22-09-01, 11:13

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •