sum() liefert falsche werte

  • Hallo zusammen,


    ich bin noch frisch in Datenbanken und bin mich noch am Einlesen. Ich habe mir testweise eine Datenbank erstellt, mit welcher ich Ausgaben, Summen, usw. am Testen bin. Soweit blicke ich auch durch, allerdings gibt es eine Sache, die partout nicht funktionieren will: SUM()


    Ich stelle euch hier kurz den Code ein, damit ihr den Query prüfen könnt. Vielleicht bin ich auch zu dumm :D



    Bei mir kommt immer 49,0 statt 49,99 raus :(

  • Stringtypen werden in SQL in Anführungszeichen gesetzt.
    Zahlentypen nicht.
    Darüber hinaus ist das Dezimaltrennzeichen der Punkt und nicht das Komma (das ist der Grund für dein Problem).


    Des Weiteren: Like wird zur Überprüfung von Zeichenketten mit Wildcards verwendet.
    Wenn, wie bei dir, keine Wildcards verwendet werden nimmt man das ganz normale =.

  • mit Round(20.00) <- Glaube ich, guck einfach mal nach, wie die Func aufgebaut ist
    oder mit StringSplit(String(20.00), ".")[1]
    ^- String(20.00) gibt "20.00" zurück, und StringSplit nimmt das erste vor dem ".", also 20.


    PS: Der 0. Rückgabewert von StringSplit ist die Anzahl der Strings.


    EDIT: Nein; String macht aus dem 20.00 schon "20", finde ich etwas blöd :/

  • @ProgrammingDonkey Es geht hier um SQL, nicht um AutoIt ;)


    Natürlich gehts hier um Autoit!
    Der Threadstarter möchte das rechnerisch korrekte SQL Ergebnis schlichtweg optisch anderst (mit 2 Dezimalstellen) in seiner Ausgabe darstellen. Dafür wurde die Funktion stringformat(...) erfunden.



    $test = StringReplace(StringFormat("%.2f", 20.5),".",",")
    ConsoleWrite($test & @CRLF)
    $test = StringReplace(StringFormat("%.2f", 20.55),".",",")
    ConsoleWrite($test & @CRLF)
    $test = StringReplace(StringFormat("%.2f", 20.555),".",",")
    ConsoleWrite($test & @CRLF)
    $test = StringReplace(StringFormat("%.2f", 20),".",",")
    ConsoleWrite($test & @CRLF)

  • Wenn man mit monetären Werten zu tun hat, sollte man es tunlichst vermeiden diese als Gleitkommazahlen zu speichern.
    Das kann zu binären Rundungsfehlern führen, welche gerade bei Geldbeträgen unbedingt vermieden werden sollten.
    Normalerweise nimmt man stattdessen Festkommazahlen.
    Sqlite besitzt leider keinen solchen Typ (auch wenn der Datentyp "Decimal" dies vermuten lässt).
    Ein üblicher Ausweg ist es daher Euro in Cent umzurechnen (also mal 100) und diese als Integer zu speichern und damit weiter zu rechnen.
    Erst in der Ausgabe wird dann noch ein Komma hinzugefügt.


    Prinzipiell wäre das mit der Ausgabe kein Problem wenn denn die printf-Funktion standardmäßig aktiviert wäre.
    Ist sie leider aber nicht und nicht jeder wird sich seine sqlite3.dll mit der entsprechenden Option selbst kompilieren.
    Daher muss man bei der Ausgabe ein bisschen mehr Aufwand treiben.


    Hier mal ein Beispiel für die Handhabung von Geldbeträgen als Integer und deren Ausgabe auf zwei Nachkommastellen: