Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Fehlerhafte Berechnung

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Mike90, 10 Oktober 2012.

  1. Mike90

    Mike90 Benutzer

    Hallo zusammen,

    Ich will in einem View eine einfache Berechnung anstellen, allerdings setzt er beim Ergebnis die Kommas an den falschen Stellen.


    Code:
    SELECT dbo.Bestandsdaten.Bestand * dbo.Preis.Staps AS WertBestand
    

    Dabei kommt das hier heraus:
    Code:
    Materialnummer        Stichtag      Bestand          Preis          Wertbestand
    Matnummer 1            Q1              169,412        145,6700      24678246,0400
    Matnummer 1            Q2              213,981        145,6700      31170612,2700
    Matnummer 2            Q1              29,5              34,9600      10313,2000
    Matnummer 2            Q2              29                34,9600      1013,8400
    


    Die Werte an sich stimmen, das Komma ist aber völlig an der falschen Stelle; bei Matnummer1 um 3 Stellen nach rechts, bei Matnummer2 um eine zuweit nach rechts.


    Für den Stichtag Q2 bei Matnummer2 stimmen die Daten allerdings wieder.


    Ich dachte, das liegt evtl. an den Datentyp nvarchar für Bestand und wollte das in decimal(12,3) umändern.

    Allerdings gibt er mir bei der Umänderung die Fehlermeldung




    aus.

    Woher kommt die Fehlermeldung und ist die Datentypänderung überhaupt die richtige Lösung?

    Vielen Dank und viele Grüße,
    Mike











     
  2. ukulele

    ukulele Datenbank-Guru

    Offensichtlich handelt es sich hier bei der Spalte Bestand um den NVARCHAR und bei Preis um einen numerischen Datentyp. Das Komma aus NVARCHAR wird nicht wie Komma sondern Punkt gesehen (US Schreibweise für tausender Trennzeichen). Du könntest also mit replace(dbo.Bestandsdaten.Bestand,',','.') arbeiten um aus dem Komma in der Zeichenkette einen Punkt (US Schreibweise für Cent Trennzeichen :) ) zu machen bevor du Berechnungen anstellst.

    Außerdem sollte der Wert nicht vom SQL Server interpretiert sondern bewusst mit einer Funktion von einem in ein anderes Format konvertiert werden und gegen Fehler oder NULL Werte abgesichert werden. Um sich den ganzen Ärger zu sparen ist natürlich ein numerischer Datentyp viel besser geeignet und auch schneller.

    Beim Ändern von Datentypen wäre ich aber vorsichtig:
    1. Kann die Anwendung eventuell damit nicht umgehen oder macht irgendwelche Probleme und
    2. Würde ich erst eine Hilfsspalte anlegen, dort die Werte reinschreiben und nach kontrolle die ursprüngliche Spalte mit diesem Werten neu erzeugen.

    Dein Fehler beruht vermutlich auf NVARCHAR Werten wie Text die er nicht konvertieren konnte. Entweder hat er die jetzt beim Konvertieren raus geschmissen oder er hat die Konvertierung nicht durchgeführt.
     
    Mike90 gefällt das.
  3. ukulele

    ukulele Datenbank-Guru

    Ich kann den Fehler nicht reproduzieren weil mein SQL 2008 R2 mit NVARCHAR gar nicht erst rechnet.

    Aber hier mal zum testen:
    Code:
    DECLARE    @test1 NVARCHAR(100),
            @test2 DECIMAL(12,4)
    SET        @test1 = '169,412'
    SET        @test2 = 145.67
    SELECT    @test1 AS Bestand,
            replace(@test1,',','.') AS [Bestand US],
            @test2 AS Preis,
            replace(@test1,',','.') * @test2 AS Wertbestand
     
  4. Mike90

    Mike90 Benutzer

    Hallo Ukulele,

    du hast Recht, Bestand ist "nvarchar" und Preis "money". Mit dem Unterschied Punkt-Komma ergeben auch die unterschiedlichen Ergebnisse einen Sinn.
    Das Replacen funktionierte nicht, also hab ich die Bestandsdaten (zum Glück noch nicht viele) gelöscht, den Datentyp der entsprechenden Spalte in decimal umgeändert und dann die Daten neu hochgeladen.
    Jetzt funktioniert alles wieder prima, die Ergebnisse stimmen :)

    Vielen Dank!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden