Anfängerfrage: JOIN, AND, WHERE

azmd108

Neuer Benutzer
Beiträge
1
Guten Tag,

wie im Titel erwähnt, bin ich noch ein blutiger Anfänger in Sachen SQL. Ich probiere derzeit viel aus, um mich in das Thema einzuarbeiten. Ich bin nun auf einen Fall gestoßen, der mich fast ans verzweifeln gebracht hat. Mittlerweile funktioniert die Abfrage, ich weiß allerdings nicht wieso .

Abfrage:
Code:
DECLARE @Monat_var int
SET @Monat_var = 2

SELECT
    @Monat_var AS Monat_var,
    CASE WHEN A.ktr_kst IS NULL THEN B.ktr_kst ELSE A.ktr_kst END AS ktr_kst,
    CASE WHEN A.ktr_kst_bez IS NULL THEN B.ktr_kst_bez ELSE A.ktr_kst_bez END AS ktr_kst_bez,
    CASE WHEN SUM(CASE WHEN A.RKO IS NULL THEN A.Warenwert ELSE A.RKO END) IS NULL THEN 'no orders' ELSE CONVERT(varchar(10), COUNT(A.ktr_kst)) + ' order(s) found' END AS ANBUS_Found,
    CASE WHEN SUM(CASE WHEN A.RKO IS NULL THEN A.Warenwert ELSE 0 END) IS NULL THEN 0 ELSE SUM(CASE WHEN A.RKO IS NULL THEN A.Warenwert ELSE 0 END) END AS Warenwert,
    SUM(CASE WHEN A.RKO IS NULL THEN 0 ELSE A.RKO END) AS RKO,
    CASE WHEN SUM(CASE WHEN A.RKO IS NULL THEN A.Warenwert ELSE A.RKO END) IS NULL THEN 0 ELSE SUM(CASE WHEN A.RKO IS NULL THEN A.Warenwert ELSE A.RKO END) END AS Summe_ANBU,
    CASE WHEN SUM(B.Kosten) IS NULL THEN 'no capex entry' ELSE CONVERT(varchar(10), COUNT(B.ktr_kst)) + ' capex entry(s) found' END AS CAPEX_Found,
    SUM(B.Kosten) AS Summe_CAPEX
FROM
    v_c_ANBU as A
    FULL JOIN v_c_CAPEX as B on A.ktr_kst = B.ktr_kst AND @Monat_var = B.Monat AND @Monat_var = A.mymonat
WHERE
    @Monat_var = A.mymonat
OR
    @Monat_var = B.Monat
GROUP BY
    CASE WHEN A.ktr_kst IS NULL THEN B.ktr_kst ELSE A.ktr_kst END, A.ktr_kst_bez, CASE WHEN A.ktr_kst_bez IS NULL THEN B.ktr_kst_bez ELSE A.ktr_kst_bez END

Folgendes soll realisiert werden:
Die Verbindung der Elemente soll auf den beiden Feldern "ktr_kst" durchgeführt werden, danach soll auch gruppiert werden. Es ist möglich, dass eine "ktr_kst" nur in einer von beiden Tabellen enthalten ist.

Variable Monat_var ist veränderbar. Diese spiegelt den numerischen Wert der Monate wieder, darauf basiert auch die Abfrage. Es sollen nur die Werte angezeigt werden, die dem entsprechenden Monat zugeordnet sind. Folgende Fälle sollen dementsprechend abgedeckt werden:

--Alles in Abhängigkeit von ktr_kst und @Monat_var--
-Zeige die Werte an, für die es Einträge in A gibt und B
-Zeige die Werte an, für die es Einträge in A gibt aber nicht in B
-Zeige die Werte an, für die es Einträge in B gibt aber nicht in A

--Gruppiert nach ktr_kst

Was mich verwirrt ist, die Abfrage (jedenfalls mit meinen Testdaten) nur korrekt funktioniert, wenn ich diesen Syntag hier nutze:
Code:
FULL JOIN v_c_CAPEX as B on A.ktr_kst = B.ktr_kst AND @Monat_var = B.Monat AND @Monat_var = A.mymonat
WHERE
    @Monat_var = A.mymonat
OR
    @Monat_var = B.Monat

Kann mir jemand erklären wieso?

Zusatzinfo:

Schizophren ist besonders der folgende Umstand:

Gestalte ich die Abfrage so:
Code:
FROM
       v_c_ANBU as A
       FULL JOIN v_c_CAPEX as B on A.ktr_kst = B.ktr_kst AND @Monat_var = B.Monat
WHERE
       @Monat_var = A.mymonat
OR
       @Monat_var = B.Monat

Funktioniert sie nur für Februar (2), setze ich anstelle von B.Monat - A.myMonat ein, funktioniert sie nur für Januar (1). So bin ich auch auf die bisherige Lösung gekommen, einfach beide Parameter zu verknüpfen. Ob die Abfrage auch für andere Monate funktionieren würde, weiß ich allerdings nicht.

Für mich erscheint das sehr doppelt-gemoppelt.

Vielen Dank im Voraus!

Mit Sicherheit ist die Abfrage für Euch Profis nicht sonderlich schön gestaltet, im Rahmen meiner Übungsphase, bekomme ich es aber noch nicht besser hin.
 
Zuletzt bearbeitet:
Werbung:
Okay sry habe den Artikel lange liegen lassen weil ich gar nicht checke was das Problem ist. Habe es mir jetzt nochmal angesehen und was du machst und auch machen willst ist erstmal ein FULL (OUTER) JOIN der beiden Tabellen, das scheint ja auch zu gehen. Sql Full Outer Join - w3resource

Wenn ich das jetzt richtig verstehe vermischt du JOIN und WHERE Bedingungen. Joinen musst du ja eigentlich immer und deine Variablen bestimmen dann, welche Daten dich interessieren. Ich glaube was du suchst ist einfach nur:
Code:
FROM
v_c_ANBU as A
FULL JOIN v_c_CAPEX as B on A.ktr_kst = B.ktr_kst
WHERE
@Monat_var = A.mymonat
OR
@Monat_var = B.Monat
 
Zurück
Oben