[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    425

    Die grosse SQL Mathematik

    Moin
    aus Zwei Dateien werden 2 relevante Sätze mit diesen Inhalten ermittelt

    A_Zahl = 1,25
    B_MWES 19,0

    Ein
    Code:
    select sum(a_Zahl), (sum(a_Zahl/100)*b_MWES, sum(a_Zahl) + (sum(a_Zahl/100)*b_MWES 
    from a inner join b on ... where ... group by ... b_mwes
    
    ergibt
    2,5        0,38             2,88
    Das krieg ich nicht gebacken

    Auch wenn ich
    Code:
    select sum(1,25), (sum(1,25/100)*19, sum(a_Zahl) + (sum(a_Zahl/100)*b_MWES 
    from a inner join b on ... where ... group by ... b_mwes
    
    mache, ergibt das 
    2,5        0,38             2,88
    ist sql defekt oder ist das so eine Wald Baum Geschichte?

  2. #2
    Registriert seit
    Sep 2005
    Beiträge
    425
    Um ganz sicher irgendwelche verknüpfungsfehler aus zu schließen habe ich das nun mal so eingegeben

    select sum(1,25), (sum(1,25/100)*19 from datei where uniquekey in(1, 2)

    = genau 2 Sätze


    ergebnis: 2,5 0,38

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Gewöhn dir einfach an, mit mehr Nachkommastellen zu rechnen, denn SQL optimiert da dann gerne welche weg:

    sum(1,25), (sum(1,25/100,00)*19,00 , sum(a_Zahl) + (sum(a_Zahl/100,00)*b_MWES
    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

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Ich würde allerdings zunächst einmal multiplizieren und zum Schluss dividieren.
    Ebenso würde ich nicht erst die Summe multiplizieren, sondern jeden einzelnen Betrag und dann die Summe zunächst runden und dann wie gewüscht casten:

    Code:
    Cast(Round(Sum(A_Zahl * b_MWES / 100,00), 11, 2) as Dec(11, 2))
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Zitat Zitat von ILEMax Beitrag anzeigen
    Um ganz sicher irgendwelche verknüpfungsfehler aus zu schließen habe ich das nun mal so eingegeben

    select sum(1,25), (sum(1,25/100)*19 from datei where uniquekey in(1, 2)

    = genau 2 Sätze


    ergebnis: 2,5 0,38
    ... mal auf die Schnelle auf dem nächstbesten (verfügbaren) System mit STRSQL ausprobiert:
    2,5 , ,4750000000 (reichlich Nullen)
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    425
    Echt?
    V7R5?
    hier kommt 0,38 anstatt 0,47500

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... V7R3

    mit welchem SQL Frontend hast Du Deine Resultate bekommen?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    425
    Aufgefallen ist das in einem SQLRPGLE Pgm, das normalerweise mehrere 1000 Sätze so berechnet.
    Und dann 'richtig' ist.
    Durch eine neue Gruppe, die etwas früh Daten geliefert hat, waren es für die nur 2 Sätze, so ist das aufgefallen.
    Bei der Fehlersuche habe ich es mit STRSQL in 'grün' nachvollzogen

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... beim SQLRPGLE gibt es da noch Einstellungen (DESRECPOS und solcher Unfug) und Felddimensionen. Der Effekt selber deutet darauf hin, dass die 2.5 entweder abgeschnitten wird oder ganzzahlig gerechnet wird. Dass die 2,5 mit Nachkommas und beim weiterrechnen abgeschnitten wir, lässt mich an einen Fehler denken. Soll der Lieferant der Datenbank doch ermitteln, was da los ist: Softwaredefekt reklamieren.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Wie sind den Deine Felder definiert?
    Ich habe auch 7.5 und bei mir kommt das Ergebnis richtig!

    Was natürlich zu bedenken ist, in SQL gibt es nur 2 "numerische" Datentypen (Integer und Float).
    Die Regel heißt, wenn 2 Integer-Werte mit einander verrechnet werden, ist das Ergebnis wieder ein Integer-Wert. Wenn Du also mit 95/100 dividierst (also 2 Integer) ist das rechnerische Ergebnis 0,95, da nichts gerundet wurde und das Ergebnis wieder eine Ganzzahl ist, ist das Ergebnis null.
    Werden Zahlen ohne Dezimal-Trennzeichen angegeben, interpretiert SQL diese als Integer-Werte. Wenn dann auch noch irgendwelche Klammern dafür sorgen, dass 2 Integer-Werte miteinander verrechnet werden, dann kann es leicht zu falschen Ergebnissen kommen.
    Deshalb sollte man grundsätzlich wenn man durch eine Zahl/Konstante dividiert, diese immer mit Dezimal-Trennzeichen und mindestens einer Nachkommastelle angeben.
    Click image for larger version. 

Name:	Screenshot 2024-12-17 184529.jpg 
Views:	48 
Size:	34,0 KB 
ID:	681
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  11. #11
    Registriert seit
    Sep 2005
    Beiträge
    425
    Also das ist seltsam ...

    Wenn ich es mit strsql mache, sind ja keine Felder beteiligt. ich gebe die Zahlen genau so ein:

    select sum(1,25), (sum(1,25/100)*19 from datei where uniquekey in(1, 2)


    im RPGSQLLE Pgm sind die Felder
    a_Zahl 8,2 und b_MWES 5,2 jeweils gepackt definiert.


    Warum ist das hier falsch?
    was kann ich noch einstellen? pgm ist angepasst, trotzdem!

  12. #12
    Registriert seit
    Sep 2005
    Beiträge
    425
    so nochwas versucht

    select 2,5/100*19 from Datei --> 0,47500000
    select sum(1,25)/100*19 from uniqueDatei where uniqueKey in(1, 2) --> 2 Sätze --> 0,38

    Was habt ihr probiert?
    die erste oder die 2. version?

Similar Threads

  1. Antworten: 0
    Letzter Beitrag: 09-02-10, 08:38
  2. Kleine Fesplatte mit grosse ersetzen
    By gugli in forum NEWSboard Server & Hardware Markt
    Antworten: 1
    Letzter Beitrag: 30-09-09, 20:30
  3. Antworten: 0
    Letzter Beitrag: 17-12-08, 08:56
  4. Löst die Spielkonsole die i5 ab???
    By Brownie in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 02-12-06, 09:02
  5. Zwei Felder zusammenfügen - Aber nur die Werte, nicht die Blanks
    By svente in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 30-03-06, 11:45

Berechtigungen

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