Benutzer mit den meisten Antworten
Probleme mit Datentyp in Abfrage

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_WertWenn 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
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]- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 18. März 2019 06:53
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 4. April 2019 14:03
-
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- Bearbeitet Stefan FalzModerator Mittwoch, 13. März 2019 16:03
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 18. März 2019 06:54
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 4. April 2019 14:03
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]- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 18. März 2019 06:53
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 4. April 2019 14:03
-
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- Bearbeitet Stefan FalzModerator Mittwoch, 13. März 2019 16:03
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 18. März 2019 06:54
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 4. April 2019 14:03
-
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 MeineIDBekomme 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
-
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
-
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
GOWenn ich diese verwende:
SELECT MeineID, dbo.TryConvertMoney(KostenIST) AS KostenIST, dbo.TryConvertMoney(KostenSOLL) AS KostenSOLL, dbo.TryConvertMoney(Einsparung) AS Einsparung
FROM dbo.MeineSichtbekomme ich ganz normal mein Ergebnis.
Nur wenn ich dann Gruppieren und Summieren will, bekomme ich die bekannte Fehlermeldung.
Viele Grüße Patrick
-
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]- Bearbeitet Olaf HelperMVP Dienstag, 19. März 2019 13:58
-
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