Abfrage SQL bringt falsches Ergebnis?

V

vms01

Hi,

ich hoffe jemand kann mir helfen denn ich weiß im Moment nicht wie der Fehler zu beheben ist. Ich Joine 2 Views miteinander.

In diesem Join möchte ich alles aus V1 haben, was in der Where Bedingung steht, und nur das was über den Join zu V2 passt. Also verwende ich einen LEFT OUTER JOIN.
Hierbei wird aber zusätzlich über ein Datm festgelegt, das ich nur Werte aus V2 haben will, wenn das V1.Datum > V2.Datum ist, aber dennoch die Werte aus V1.

Leider bekomme ich, sobald V1.Datum < V2.Datum ist, gar keine Werte angezeigt, auch nicht aus V1, wobei das mit meinem Join schon ein Ergebnis liefern müsste.

Anbei mein SQL Statement:

SELECT V1.Organisationseinheit, CAST(V1.SPSTB AS DATE) AS SPSTB,
SUM(V1.ABI) AS ABI,V2.Stunden
FROM dbo.V_ORA_SP_mit_OE_WTText V1 LEFT OUTER JOIN
dbo.V_MAN_Erloeste_Stunden_WTText V2 ON V1.Organisationseinheit = V2.OE AND
V1.WEEKDAY = V2.WEEKDAY AND
CAST(V1.SPSTB AS DATE) > CAST(V2.[gueltig ab] AS DATE)
WHERE (V1.DISPO = 'OPTIBUS' AND V1.DIB = 'M' AND (V2.KPI = '3.6' OR V2.KPI IS NULL))
GROUP BY V1.Organisationseinheit, CAST(V1.SPSTB AS DATE),
V2.Stunden



Hoffe jemand kann mir Tipps geben.

Danke schonmal.
 
SQL:
SELECT     V1.Organisationseinheit, CAST(V1.SPSTB AS DATE) AS SPSTB,
                     SUM(V1.ABI) AS ABI,V2.Stunden
FROM          dbo.V_ORA_SP_mit_OE_WTText V1 LEFT OUTER JOIN
                     dbo.V_MAN_Erloeste_Stunden_WTText V2 ON V1.Organisationseinheit = V2.OE AND
                     V1.WEEKDAY = V2.WEEKDAY AND 
                     CAST(V1.SPSTB AS DATE) > CAST(V2.[gueltig ab] AS DATE)
WHERE      (V1.DISPO = 'OPTIBUS' AND V1.DIB = 'M' AND (V2.KPI = '3.6' OR V2.KPI IS NULL))
GROUP BY V1.Organisationseinheit, CAST(V1.SPSTB AS DATE),
                      V2.Stunden

Mal generell ein Tipp :

Dreh Dein Statement mal auf links und packe das ganze gecaste in ein Subselect. Also irgendwas in der Form

SQL:
 SELECT  V1.Organisationseinheit
 , CAST(V1.SPSTB AS DATE) AS SPSTB
 ,  V1.ABI
 , V1.WEEKDAY 
 FROM dbo.V_ORA_SP_mit_OE_WTText V1
 WHERE      (V1.DISPO = 'OPTIBUS' AND V1.DIB = 'M'

Ausserdem würde mich mal interessieren, welcher Ursprungstyp hinter den Spalten mit dem Datecast steckt. Einen String muss man zumindestens bei Oracle nämlich qualifiziert konvertieren, bei einem CAST kommt nur schrott raus.

Ausserdem solltest Du dir darüber klar sein, dass ein CAST in der JOIN Klausel ein Garant für unterirdische Performance ist.

Grüße
gore
 
Zuletzt bearbeitet von einem Moderator:
Hi,

es handelt sich um MS SQL.

Der Ursprungstyp der gecasteten Spalte ist ein DATETIME und ich brauch für den Join eben nur ein DATE. Das sollte aber in der Abfrage keine Probleme machen.

Trotzdem weiß ich nicht wo der Fehler liegt.

Danke für die Hilfe!!
 
Doch, hier :)

1. nimm die beiden Statement-Teile
2. Füge eine Sortierung über die JOIN-Schlüssel hinzu
3. Frage jeweils die beiden Statements ab und verifiziere, dass das mit dem JOIN klappen würde

Meine Vermutung liegt darin, daß sich die DATETIME Spalten irgendworin unterscheiden (Zeitzonen etc). Zusätzlich solltest Du Dir die MS-SQL Doku anschauen und das CAST vernünftig typisieren (also mit Konvertierungsvorgabe) sonst kommt da nur Schmarrn raus.

Nachtrag : Prüfe auch sukzessiv Deine WHERE Klausel-Bestandteile. Ist die V_ORA Tabelle ein dblink auf einen Oracle-View?

Grüße
gore
 
Hab die Lösung!! ;)

Die Abfrage auf die KPI darf nicht in der Where Klausel sein, denn hier betrifft Sie komischerweise beide Tabellen. Wenn ich Sie aber in die LEFT OUTER JOIN Anweisung setze, dann funktioniert das ganze:


SELECT V1.Organisationseinheit, CAST(V1.SPSTB AS DATE) AS SPSTB,
SUM(V1.ABI) AS ABI,V2.Stunden
FROM dbo.V_ORA_SP_mit_OE_WTText V1 LEFT OUTER JOIN
dbo.V_MAN_Erloeste_Stunden_WTText V2 ON V1.Organisationseinheit = V2.OE AND
V1.WEEKDAY = V2.WEEKDAY AND
CAST(V1.SPSTB AS DATE) > CAST(V2.[gueltig ab] AS DATE)
AND (V2.KPI = '3.6' OR V2.KPI IS NULL)
WHERE (V1.DISPO = 'OPTIBUS' AND V1.DIB = 'M')
GROUP BY V1.Organisationseinheit, CAST(V1.SPSTB AS DATE),
V2.Stunden



Danke für die große Hilfe
 

Neue Beiträge

Zurück