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

Anfängerfrage: JOIN, AND, WHERE

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von azmd108, 17 Juni 2016.

  1. azmd108

    azmd108 Neuer Benutzer

    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: 17 Juni 2016
  2. ukulele

    ukulele Datenbank-Guru

    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
     
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