none
Probleme mit Datentyp in Abfrage RRS feed

  • Frage

  • Hallo Zusammen,

    ich versuche folgende Abfrage zu erstellen:

    SELECT      MeinINT_Wert, SUM(MeinMoneyWert1 ) AS Summe1, SUM(MeinMoneyWert2) AS Summe2
    FROM          meineSicht
    GROUP BY MeinINT_Wert

    Wenn ich mir "meineSicht" im Management Studio anschaue, sehe ich eindeutig, dass die einzelnen Spalten den oben angegebenen Datentyp haben.

    Wenn ich nun aber die Sicht erstellen will, erhalte ich die Fehlermeldung "Ein char-Wert kann nicht in einen money-Wert konvertiert werden. Die Syntax des char-Wertes ist falsch."

    Nun ist es in der Tat so, dass in der zugrundeliegende Tabelle meiner Sicht die Datentypen für MeinMoneyWert1 und MeinMOneyWert2 varchar Werte sind. Das liegt daran, dass in der Ursprungstabelle hier durchaus varchar Werte stehen können.

    Durch vorausgegangene Abfragen habe ich aber längst die Werte selektiert die Money Werte sind und mit CAST in solche konvertiert. Deshalb sind sie für diese Sicht im Management Studio auch so angegeben. Ich habe versucht die Werte in der aktuellen Sicht dann eber nochmals mit CAST zu bearbeiten, das bringt aber keine Änderung.

    Was mache ich falsch? WIe bekomme ich die Summe der Werte?

    Vielen Dank für Hilfe.

    Grüße

    Patrick

    Mittwoch, 13. März 2019 14:51

Antworten

Alle Antworten

  • Durch vorausgegangene Abfragen habe ich aber längst die Werte selektiert die Money Werte sind und mit CAST in solche konvertiert. 

    Hallo Patrick,

    ich habe Deinen Ausführungen nicht so ganz folgen können. MeinMoneyWert1 und MeinMoneyWert2 sind also weiterhin vom Typ varchar? Was hast Du dann von wo & in was konvertiert.

    Die Fehlermeldung ist soweit klar, Du solltest die Felder zunächst explizit konvertieren und dann summieren. Ab Version 2012 kannst Du die TRY_CONVERT (Transact-SQL) Funktion verwenden

    SELECT      MeinINT_Wert, SUM(TRY_CONVERT(money, MeinMoneyWert1)) AS Summe1, SUM(TRY_CONVERT(money, MeinMoneyWert2)) AS Summe2
    FROM          meineSicht
    GROUP BY MeinINT_Wert


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 13. März 2019 15:58
  • Hallo Patrick,

    wenn deine Datenquelle definitiv nur diese Datentypen beinhaltet, sollte das eigentlich klappen. Daher nehme ich mal an, dass doch nicht durchgängig konvertiert wird.

    Poste doch mal die Ausgangstabelle als CREATE TABLE Statement, Beispieldaten als INSERT INTO Statement und dazu noch die Zwischenabfragen, die filtern und casten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 13. März 2019 16:00
    Moderator
  • Hallo Olaf,

    danke für die Antwort. Die Basis ist eine Tabelle in denen die zu berechnenden Felder varchar sind.

    Ich habe diese aber in mehrere Abfragen vor meiner Summen Abfrage schon durch CAST in Money konvertiert.

    Aber selbst wenn ich das nicht mache und so vorgehe:

    SELECT     MeineID, SUM(CAST(KostenIST AS Money)) AS KostenIST, SUM(CAST(KostenSOLL AS Money)) AS KostenSOLL, CAST(Einsparung AS Money) AS Einsparung
    FROM          dbo.MeineSicht
    GROUP BY MeineID

    Bekomme ich die genannte Fehlermeldung. Das ist mir unerklärlich.

    Leider bin ich mit dieser Datenbank noch auf SQL unter 2012.

    Hast Du - oder jemand anderes - noch eine Idee?Grüße

    Patrick


    • Bearbeitet Patrick2P Dienstag, 19. März 2019 13:20
    Dienstag, 19. März 2019 13:08
  • Hallo Stefan,

    das sind einige Zwischenabfragen. Die jetzt alle zu posten wäre etwas viel.

    Die Quelle, also die Tabelle auf die sich die Abfragen bezieht, liefert varchar Werte.

    Dazwischen kommen einige Abfragen die Filtern und Berechnungen (money * decimal z.b.), deren Ergebnis ich aber jeweils immer mit CAST in Money konvertiere. Bis zu dieser Summen Abfrage klappt das auch alles problemlos. Es rechnet immer.

    Nur hier hängt es jetzt.

    Grüße

    Patrick

    Dienstag, 19. März 2019 13:12
  • Da ich kein Try_Convert habe, habe ich mir meine eigene Funktion dazu gebaut:

    CREATE FUNCTION dbo.TryConvertMoney
    (
      @value nvarchar(4000)
    )
    RETURNS money
    AS
    BEGIN
      RETURN (SELECT CONVERT(money, CASE
        WHEN ISNUMERIC(@value) = 1 THEN @value END)
      );
    END
    GO           

    Wenn ich diese verwende:

    SELECT      MeineID, dbo.TryConvertMoney(KostenIST) AS KostenIST, dbo.TryConvertMoney(KostenSOLL) AS KostenSOLL, dbo.TryConvertMoney(Einsparung) AS Einsparung
    FROM          dbo.MeineSicht

    bekomme ich ganz normal mein Ergebnis.

    Nur wenn ich dann Gruppieren und Summieren will, bekomme ich die bekannte Fehlermeldung.


    Viele Grüße Patrick

    Dienstag, 19. März 2019 13:35
  • IsNumeric ist kein Garant, der liefert für alles, was in irgendeinen numerischen Typ konvertiert werden kann ein 1 zurück. Beispiel Werte mit Exponentialdarstellung. Das Konvertieren nach Float geht, nach Money wirft den gleichen Fehler aus.

    select ISNUMERIC('1E4') ;
    go
    select convert(float, '1E4') ;
    go
    select convert(money, '1E4') ;
    go
    Du musst Deine Daten noch mal durch gehen um den Fehlerauslöser zu finden.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Dienstag, 19. März 2019 13:57
  • Kann es sein, dass  sich GROUP BY nicht auf die Werte der zugrundeliegenden Abfrage bezieht, sondern auf die Ursprungstabelle durchgreift? Nur dort stehen noch varchar Werte.

    Meine Abfrage, die ich groupieren will, liefert nur sechs Zeilen. Und das sind alles Money Werte. Ganz eindeutig.

    Ich werde mir jetzt so helfen, dass ich eine separate 1:1 Tabelle erstelle in die ich in ein explizites decimal Feld alle Werte schreibe die auch wirklich decimal sind.

    Damit habe ich jetzt zwar doppelte Daten, aber ich muss voran kommen. Kann ich ja wieder auflösen wenn ich das Convert Problem lösen sollte.

    Danke aber schon mal bis hier.

    Grüße

    Patrick


    Viele Grüße Patrick

    Dienstag, 19. März 2019 14:26