-- Deklarieren der Parameter für den Stichtag und das Lager
DECLARE @Stichtag AS DATE = @date;
DECLARE @warenlager INT =
@warehouse;
-- Hauptabfrage zur Berechnung der Lagerbewertung
SELECT
tArtikel.cArtNr AS Artikelnummer,
MAX(tArtikelBeschreibung.cName) AS Artikelname,
tWarenLager.cName AS Lager,
-- Berechnung des Bestands zum Stichtag
SUM(
ISNULL(tWarenLagerEingang.fAnzahl, 0.0) -- Summe der Wareneingänge bis zum Stichtag
- ISNULL(Warenausgang.fAnzahl, 0.0) -- Abzüglich der Warenausgänge bis zum Stichtag
) AS Bestand,
-- Berechnung des Gesamt-EK-Werts zum Stichtag
SUM(
(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) -- Summe der Wareneingänge
- ISNULL(Warenausgang.fAnzahl, 0.0)) -- Abzüglich der Warenausgänge
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) -- Multipliziert mit dem Einzel-EK-Preis
) AS EKGesamt,
-- Ermittlung des letzten Lieferdatums
MAX(tWarenLagerEingang.dGeliefertAm) AS LetztesLieferdatum,
-- Bestimmung der Abwertungsstufe basierend auf dem letzten Lieferdatum
CASE
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) THEN 'dieses Jahr 100%'
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 1 THEN 'Letztes Jahr 90%'
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 2 THEN 'Vorletztes Jahr 80%'
ELSE 'älter als vor 2 Jahren 50%'
END AS Abwertung,
-- Berechnung des wertberichtigten EK-Werts basierend auf der Abwertung
COALESCE(
CASE
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag)
THEN SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0))
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 1
THEN SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) * 0.9)
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 2
THEN SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) * 0.8)
ELSE SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) * 0.5)
END
, 0.0) AS Wertberichtigt
FROM dbo.tWarenLagerPlatz
LEFT JOIN dbo.tWarenLagerEingang
ON tWarenLagerPlatz.kWarenLagerPlatz = tWarenLagerEingang.kWarenLagerPlatz
AND tWarenLagerEingang.dErstellt <= @Stichtag -- Nur Wareneingänge bis zum Stichtag
JOIN dbo.tWarenLager
ON tWarenLagerPlatz.kWarenLager = tWarenLager.kWarenLager
LEFT JOIN dbo.tArtikel
ON tWarenLagerEingang.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.tSpracheUsed
ON dbo.tSpracheUsed.nStandard = 1
LEFT JOIN dbo.tArtikelBeschreibung
ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
AND dbo.tSpracheUsed.kSprache = tArtikelBeschreibung.kSprache
-- Subquery zur Berechnung der Warenausgänge bis zum Stichtag
LEFT JOIN
(
SELECT
SUM(ISNULL(tWarenLagerAusgang.fAnzahl, 0.0)) AS fAnzahl,
tWarenLagerAusgang.kWarenLagerEingang
FROM dbo.tWarenLagerAusgang
WHERE tWarenLagerAusgang.dErstellt <= @Stichtag -- Nur Warenausgänge bis zum Stichtag
GROUP BY tWarenLagerAusgang.kWarenLagerEingang
) AS Warenausgang
ON tWarenLagerEingang.kWarenLagerEingang = Warenausgang.kWarenLagerEingang
-- Filtern nach dem ausgewählten Lager
WHERE tWarenLager.kWarenLager = @warenlager
-- Gruppieren nach Lagername und Artikelnummer
GROUP BY tWarenLager.cName, tArtikel.cArtNr
-- Sortieren nach Artikelnummer
ORDER BY tArtikel.cArtNr;