Transact-SQL - Diff. aus mehreren Select-Abfragen berechnen
Hallöchen.
Ich habe ein Problem mit (T)SQL und komme nicht weiter.
Ich habe eine Tabelle ('Belegp') in der u.A. die folgenden Felder existieren:
Ich brauche nun eine Abfrage, die mir folgende Werte anzeigt:
Ich habe 2 Probleme.
1.) Wie kann ich die Differenz zwischen "WE" und "WA" ausrechnen
2.) Ich habe schon zwei Statements, um die Mengen zu summieren.
Wenn ich diese einzeln ausführe, funktioniert es.
Wenn ich diese Statements aber verschachtle, um die Spalte WA und WE in einer Abfrage ausgegeben zu bekommen, sind die Werte der beiden Spalten (WA und WE) bei jeder Artikelnummer gleich.
Die einzelnen Statements:
WA
WE
Das verschachtelte Statement:
Wo bin ich hier daneben?
LG CreamyCewie
Ich habe ein Problem mit (T)SQL und komme nicht weiter.
Ich habe eine Tabelle ('Belegp') in der u.A. die folgenden Felder existieren:
- Artikelnummer
- Menge
- Belegtyp
Ich brauche nun eine Abfrage, die mir folgende Werte anzeigt:
WA | WE | ~ Differenz | Artikelnummer |
---|---|---|---|
Summe aller Mengen, aus Zeilen wo der Belegtyp entweder "R", "L" oder "K" ist | Summe aller Mengen, aus Zeilen wo der Belegtyp entweder "E" oder "S" ist | Differenz (Spalte WE - Spalte WA | Artikelnummer |
Ich habe 2 Probleme.
1.) Wie kann ich die Differenz zwischen "WE" und "WA" ausrechnen
2.) Ich habe schon zwei Statements, um die Mengen zu summieren.
Wenn ich diese einzeln ausführe, funktioniert es.
Wenn ich diese Statements aber verschachtle, um die Spalte WA und WE in einer Abfrage ausgegeben zu bekommen, sind die Werte der beiden Spalten (WA und WE) bei jeder Artikelnummer gleich.
Die einzelnen Statements:
WA
select Artikelnummer, SUM (Menge)'WA'
from belegp where belegtyp = 'R' /*WA-Rechnung*/ or belegtyp = 'L' /*WE-Rechnung*/ or belegtyp = 'K' /*WA-Lieferschein*/ and status = '0'
group by Artikelnummer
WE
select Artikelnummer, SUM (Menge)'WE'
from belegp where belegtyp = 'E' /*WE-Rechnung*/ or belegtyp = S' /*WE-Lieferschein*/ and status = '0'
group by Artikelnummer
Das verschachtelte Statement:
select Artikelnummer,
(select SUM (Menge) from belegp where belegtyp = 'R' /*WA-Rechnung*/ or belegtyp = 'L' /*WE-Rechnung*/ or
belegtyp = 'K' /*WA-Lieferschein*/ and status = '0') 'WA'
from belegp
group by Artikelnummer
Wo bin ich hier daneben?
LG CreamyCewie
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 372056
Url: https://administrator.de/contentid/372056
Ausgedruckt am: 23.11.2024 um 04:11 Uhr
1 Kommentar
Ich habe mir mal erlaubt mit IN-Operator zu vergleichen und würde die empfehlen, die Spalten WA und WE mit CASE zu ermitteln. CASE berücksichtigt dann den Wert in Menge nur wenn er die entsprechenden Kriterien erfüllt. So hast du erstmal zwei saubere Spalten WA und WE. Vorteil ist ganz klar das nicht wie in deinem Ansatz für jede Zeile im Select ein Subselect gegen die Tabelle ausgeführt wird, das kann Performance kosten.
Die Spalte Differenz kann man natürlich auch über mehrere Wege bilden. Wenn der Select komplex wird sollte man das schachteln, also erst WA und WE bilden und darauf dann einen Select machen und die Differenz berechnen. In diesem Fall ist das aber nicht so wild das sum(CASE ...) doppelt auszuführen.
Die Spalte Differenz kann man natürlich auch über mehrere Wege bilden. Wenn der Select komplex wird sollte man das schachteln, also erst WA und WE bilden und darauf dann einen Select machen und die Differenz berechnen. In diesem Fall ist das aber nicht so wild das sum(CASE ...) doppelt auszuführen.
SELECT Artikelnummer,
sum(CASE WHEN belegtyp IN ('R','L','K') THEN Menge ELSE 0 END) AS 'WA',
sum(CASE WHEN belegtyp IN ('E','S') THEN Menge ELSE 0 END) AS 'WE',
sum(CASE WHEN belegtyp IN ('E','S') THEN Menge ELSE 0 END) -
sum(CASE WHEN belegtyp IN ('R','L','K') THEN Menge ELSE 0 END) AS 'Differenz'
FROM belegp
WHERE belegtyp IN ( 'R' /*WA-Rechnung*/,'L' /*WE-Rechnung*/,'K' /*WA-Lieferschein*/,'E' /*WE-Rechnung*/,'S' /*WE-Lieferschein*/ )
AND [status] = '0'
GROUP BY Artikelnummer