creamycewie
Goto Top

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

Content-ID: 372056

Url: https://administrator.de/contentid/372056

Ausgedruckt am: 23.11.2024 um 04:11 Uhr

ukulele-7
Lösung ukulele-7 24.04.2018 aktualisiert um 14:22:59 Uhr
Goto Top
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.
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