MYSQL left join wenn eine Tabelle kein Ergebnis liefert

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Torsten66

Grünschnabel
Hallo zusammen,
ich stehe auf dem Schlauch und brauche mal einen Schubs.
Ich habe 3 Tabellen:

1. Artikel
ARTIKELNRBEZEICHNUNG
110099​
Anlagenschlüssel - Silca

2. Lager
ARTIKELNRLAGERNRBESTAND
110099​
1​
13​
110099​
5​
2​

3. Lagerbewegung
ARTIKELNRLAGERNRMENGEBELEGNUMMERDATUM
110099​
1​
2​
1​
2016-11-15 13:14:00.000
110099​
1​
5​
20738602​
2020-03-13 15:14:05.000
110099​
1​
-5​
20389075​
2020-03-16 15:00:06.000
110099​
1​
2​
20398756​
2020-07-24 14:40:25.000
110099​
5​
5​
20398756​
2020-07-24 14:40:25.000

Das Ziel ist die Anzeige aller Artikel mit aktuellem Bestand und der Anzahl der Bewegungen in einem bestimmten Jahr für Belege mit 8-stelliger Belegnummer.
Meine Abfrage dazu:
SQL:
select a.ARTIKELNR, max(a.BEZEICHNUNG) Bezeichnung, sum(l.buchbestand) akt_Bestand, l.LAGERNR, count(lb.artikelnr) Anzahl_Bewegungen
    from Artikel a
    left join LAGER l on a.ARTIKELNR = l.ARTIKELNR
    left join Lagerbewegung lb on a.ARTIKELNR = lb.ARTIKELNR and l.lagernr = lb.LAGERNR
    where a.ARTIKELNR = '110099'
        and len(lb.BELEGNUMMER) = 8
        and year(lb.DATUM) = 2020
    group by a.ARTIKELNR, l.LAGERNR
;
Das funktioniert auch soweit und das Ergebnis ist:
ARTIKELNRBezeichnungakt_BestandLAGERNRAnzahl_Bewegungen
110099​
Anlagenschlüssel - Silca
13​
1​
3​
110099​
Anlagenschlüssel - Silca
2​
5​
1​

Das Problem ist jetzt, wenn ein Jahr abgefragt wird, in dem keine Bewegung war:
SQL:
select a.ARTIKELNR, max(a.BEZEICHNUNG) Bezeichnung, sum(l.buchbestand) akt_Bestand, l.LAGERNR, count(lb.artikelnr) Anzahl_Bewegungen
    from Artikel a
    left join LAGER l on a.ARTIKELNR = l.ARTIKELNR
    left join Lagerbewegung lb on a.ARTIKELNR = lb.ARTIKELNR and l.lagernr = lb.LAGERNR
    where a.ARTIKELNR = '110099'
        and len(lb.BELEGNUMMER) = 8
        and year(lb.DATUM) = 2019 
    group by a.ARTIKELNR, l.LAGERNR
;
Hier kommt kein Ergebnis, aber das Ziel ist, dass nur die Anzahl_Bewegungen leer oder 0 ist, z.B.
ARTIKELNRBezeichnungakt_BestandLAGERNRAnzahl_Bewegungen
110099​
Anlagenschlüssel - Silca
13​
1​
110099​
Anlagenschlüssel - Silca
5​
4​
 
Zuletzt bearbeitet von einem Moderator:
Dein Problem: Du machst zuerst den Join und filtert erst danach. Das macht den LEFT JOIN zunichte. Du solltest in der Quelle filtern. Dann gibt er alle Lager aus, egal ob Bewegungen dazu vorhanden sind
SQL:
select a.ARTIKELNR, max(a.BEZEICHNUNG) Bezeichnung, sum(l.buchbestand) akt_Bestand, l.LAGERNR, count(lb.artikelnr) Anzahl_Bewegungen
    from Artikel a
    left join LAGER l on a.ARTIKELNR = l.ARTIKELNR
    left join (
            select ARTIKELNR, LAGERNR
            from Lagerbewegung 
            where len(BELEGNUMMER) = 8 and year(DATUM) = 2019 
        ) lb on a.ARTIKELNR = lb.ARTIKELNR and l.lagernr = lb.LAGERNR
    where a.ARTIKELNR = '110099'
    group by a.ARTIKELNR, l.LAGERNR
;
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge

Zurück