Neu SQL Abfrage für verkaufte Artikel nach Plattformen

  • Wichtiger Hinweis Liebe Kunden, solltet Ihr den DATEV Rechnungsdatenservice 2.0 nutzen, dann müsst Ihr bis zum 30.06.2024 JTL-Wawi 1.9 installieren. Danach wird die Schnittstelle für ältere Versionen nicht mehr unterstützt.

lantelme

Neues Mitglied
3. September 2019
4
4
Hallo euch allen,

ich will eine Abfrage erstellen die in den Zeilen unsere SKU und in den Spalten die Anzahl der Verkäufe dieser Artikel nach Plattform sowie in verschiedenen Zeitenräumen anzeigt.
Meine Abfrage sieht so aus (als Beispiel nur den Part für Amazon.de):
USE eazybusiness
SELECT tbestellpos.cArtNr AS SKU

,case when tBestellung.dErstellt > DATEADD(DAY, -7, getdate()) and MIN(tBestellung.nPlatform) = 51 then convert(int,sum(tbestellpos.nAnzahl)) else 0 end AS AmazonDeWoche
,case when tBestellung.dErstellt > DATEADD(DAY, -30, getdate()) and MIN(tBestellung.nPlatform) = 51 then convert(int,sum(tbestellpos.nAnzahl)) else 0 end AS AmazonDe30
,case when tBestellung.dErstellt > DATEADD(DAY, -90, getdate()) and MIN(tBestellung.nPlatform) = 51 then convert(int,sum(tbestellpos.nAnzahl)) else 0 end AS AmazonDe90
,case when tBestellung.dErstellt > DATEADD(DAY, -365, getdate()) and MIN(tBestellung.nPlatform) = 51 then convert(int,sum(tbestellpos.nAnzahl)) else 0 end AS AmazonDe365
,case when MIN(tBestellung.nPlatform) = 51 then convert(int,sum(tbestellpos.nAnzahl)) else 0 end AS AmazonDeGes

FROM tBestellung
JOIN tbestellpos
ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
WHERE ISNULL(tbestellung.cType,'') = 'B'
AND ISNULL(tbestellpos.cArtNr,' ') <> ' '
GROUP BY cArtNr
ORDER BY cArtNr asc
Jede Gesamtabfrage, die kein Datum abfrägt, funktioniert einwandfrei. Nun zu meinem Problem. Das Management Studio gibt mir den Fehler "Die tBestellung.dErstellt-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist." aus. Zu Beginn hatte ich das selbe Problem mit der Spalte nPlatform, doch dieses konnte ich dank MIN() umgehen. Eben jenes kann ich aber nicht bei einem Datum verwenden.
Wenn ich die Spalte dErstellt in die GROUP BY Klausel einbinde, bekomme ich die selbe SKU mehrmals angezeigt (für jede verkaufte Position ein mal), was nicht Sinn und Zweck der Sache ist.

Mir gehen langsam die Ideen aus. Bin für jede Hilfe dankbar!
MfG
 

exxxtensa

Neues Mitglied
21. Oktober 2019
1
1
Sag ihm, er soll das nächste mal gleich mich fragen ;)
@DieMods: Wir kennen uns privat.

Also, hier bidde. ABER: ist leider ungetestet. Sitze hier am Mac und habe gerade kein Management Studio, kann das erst morgen mit dir verifizieren/korrigieren
SQL:
 --Variablen für den Zeitvergleich, spart code
DECLARE @dat7 datetime = dateadd(day, -7, getdate());
DECLARE @dat30 datetime = dateadd(day, -30, getdate());
DECLARE @dat90 datetime = dateadd(day, -90, getdate());
DECLARE @dat365 datetime = dateadd(day, -365, getdate());

declare @amazonDE smallint = 51;
--hier noch die anderen shops einfügen

USE eazybusiness;

SELECT cArtNr AS SKU

--AmazonDE
,sum(case when dErstellt > @dat7 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS Amazon7
,sum(case when dErstellt > @dat30 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDE30
,sum(case when dErstellt > @dat90 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDE90
,sum(case when dErstellt > @dat365 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDE365
,sum(case when nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDEGes

--und so weiter mit amazonUS, amazonIT, etc..

--Beispiel für Amazon alle Länder Gesamt:
,sum(case when nPlatform between 50 and 60) then convert(int, nAnzahl) else 0 int) as AmazonGes
--oder besser
,sum(case when nPlatform between @amazonDE and @amazonUS) then convert(int, nAnzahl) else 0 int) as AmazonGes2 --variablen noch deklarieren

FROM tBestellung
LEFT JOIN tbestellpos
ON kBestellung = tBestellung_kBestellung
WHERE ISNULL(cType,'') = 'B'
AND TRIM(ISNULL(cArtNr,'') <> ''
GROUP BY cArtNr
ORDER BY SKU asc
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: lantelme

IT-WEFA

Gut bekanntes Mitglied
3. April 2019
274
19
Sag ihm, er soll das nächste mal gleich mich fragen ;)
@DieMods: Wir kennen uns privat.

Also, hier bidde. ABER: ist leider ungetestet. Sitze hier am Mac und habe gerade kein Management Studio, kann das erst morgen mit dir verifizieren/korrigieren
SQL:
 --Variablen für den Zeitvergleich, spart code
DECLARE @dat7 datetime = dateadd(day, -7, getdate());
DECLARE @dat30 datetime = dateadd(day, -30, getdate());
DECLARE @dat90 datetime = dateadd(day, -90, getdate());
DECLARE @dat365 datetime = dateadd(day, -365, getdate());

declare @amazonDE smallint = 51;
--hier noch die anderen shops einfügen

USE eazybusiness;

SELECT cArtNr AS SKU

--AmazonDE
,sum(case when dErstellt > @dat7 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS Amazon7
,sum(case when dErstellt > @dat30 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDE30
,sum(case when dErstellt > @dat90 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDE90
,sum(case when dErstellt > @dat365 and nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDE365
,sum(case when nPlatform = @amazonDE then convert(int, nAnzahl) else 0 end) AS AmazonDEGes

--und so weiter mit amazonUS, amazonIT, etc..

--Beispiel für Amazon alle Länder Gesamt:
,sum(case when nPlatform between 50 and 60) then convert(int, nAnzahl) else 0 int) as AmazonGes
--oder besser
,sum(case when nPlatform between @amazonDE and @amazonUS) then convert(int, nAnzahl) else 0 int) as AmazonGes2 --variablen noch deklarieren

FROM tBestellung
LEFT JOIN tbestellpos
ON kBestellung = tBestellung_kBestellung
WHERE ISNULL(cType,'') = 'B'
AND TRIM(ISNULL(cArtNr,'') <> ''
GROUP BY cArtNr
ORDER BY SKU asc
es fehlt ein schließende Klammer ")"
nach
AND TRIM(ISNULL(cArtNr,'')
 
  • Gefällt mir
Reaktionen: aadursun
16. November 2022
5
2
Hallo ihr Lieben,
ich will eine SQL Abfrage erstellen, die in den Zeilen unsere Artikelnamen und in den Spalten die Warengruppe [Name], die Anzahl der Verkäufe dieser Artikel in verschiedenen Zeitenräumen [7, 30, 90, 365] und den Artikelbestand [in allen Lagern] abfragt.

Zusatz:
Optimaler Weise kann ich in der Abfrage einstellen, welche Warengruppe ausgewertet wird, sodass beispielsweise nur die Warengruppe Buch abgefragt wird.

Die Datenbank ist eazybusiness.
 

John

Sehr aktives Mitglied
3. März 2012
2.743
542
Berlin
In den Tiefen des Forums gabs mal eine Eigene Übersicht für den Bereich Artikel zu eine ähnlichen Thema. Da kannst Du dich zumindest für den teil der Verkäufe in den Zeiträumen von inspiriren lassen.

Code:
-- wenn Vaterartikel, dann ganz oben auch die gesamtsumme aller kinder
-- ergänzen um  Abverkaufsquote (verkaufte Teile / (verkaufte Teile + Lagerbestand

-- wenn Stückliste, dann alle Komponenten anzeigen und ganz oben die Gesamtsumme der Kinder
-- Wenn Std Artikel, dann auch anzeigen
-- (wenn komponente von SL -> Dann alle SLs auch anzeigen)
--


-- Vaterartikel bei Varkombis
SELECT 
  'Vater (kumuliert)' AS 'Artikeltyp',
  jArtikel.cArtNr AS ArtNr,
        CONCAT('(Vater kumuliert) ', jArtikel.cName) AS Artikelname,
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar)), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fZulauf)), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(SUM(jLetzte365Tage.absatz), 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar) / (ISNULL(SUM(jLetzte365Tage.absatz), 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(SUM(jLetzte30Tage.absatz), 0) AS 'Absatz 30 Tage',
        ISNULL(SUM(jLetzte90Tage.absatz), 0) AS 'Abs. 90 Tage',
        ISNULL(SUM(jLetzte365Tage.absatz), 0) AS 'Abs. 365 Tage',
        ISNULL(SUM(jAbsatzGesamt.absatz), 0) AS 'Abs. Gesamt',
        ISNULL(AVG(jVKDurchschnitt.vk), 0) AS 'Ø VK-Brutto',
        CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(AVG(jRetourenGesamt.Retourenquote), 0))), 1), '%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(SUM(jLetzte30Tage.absatz), 0) > 0 OR SUM(vLagerbestandEx.fVerfuegbar) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(SUM(jLetzte30Tage.absatz), 0) / (SUM(vLagerbestandEx.fVerfuegbar) + ISNULL(SUM(jLetzte30Tage.absatz), 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Abverkaufsquote (Monat)'
FROM tartikel
JOIN
(SELECT tartikel.kArtikel, cArtNr, tArtikelBeschreibung.cName
 FROM tartikel
 JOIN dbo.tSpracheUsed ON nStandard = 1
 JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
  AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
  AND tArtikelBeschreibung.kPlattform=1
 WHERE tartikel.kArtikel = @Key
) AS jArtikel ON jArtikel.kArtikel = @Key
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        (ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100 as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key
GROUP BY kVaterArtikel, jArtikel.cArtNr, jArtikel.cName

UNION -- Kindartikel
SELECT 
  '-Kindartikel' AS 'Artikeltyp',
  tartikel.cArtNr AS ArtNr,
        tArtikelBeschreibung.cName AS Artikelname,       
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key

UNION -- Standardartikel
SELECT 
  CASE
   WHEN tartikel.kStueckliste > 0 THEN 'Stückliste'
   ELSE 'Standardartikel'
  END  AS 'Artikeltyp',
  tartikel.cArtNr AS ArtNr,
  CASE
   WHEN tartikel.kStueckliste > 0 THEN CONCAT('(Stückliste) ', tArtikelBeschreibung.cName)
   ELSE tArtikelBeschreibung.cName
  END AS Artikelname,
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel = @Key
 AND nIstVater = 0

UNION -- Stücklistenkomponenten
SELECT 
  '-Komponente' AS 'Artikeltyp',
  tartikel.cArtNr AS ArtNr,
        tArtikelBeschreibung.cName AS Artikelname,       
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel IN (SELECT tStueckliste.kArtikel FROM tartikel JOIN tStueckliste ON tStueckliste.kStueckliste = tartikel.kStueckliste WHERE tartikel.kArtikel = @Key)
 AND nIstVater = 0
ORDER BY Artikeltyp DESC, ArtNr
 

arich001

Gut bekanntes Mitglied
21. April 2021
188
15
In den Tiefen des Forums gabs mal eine Eigene Übersicht für den Bereich Artikel zu eine ähnlichen Thema. Da kannst Du dich zumindest für den teil der Verkäufe in den Zeiträumen von inspiriren lassen.

Code:
-- wenn Vaterartikel, dann ganz oben auch die gesamtsumme aller kinder
-- ergänzen um  Abverkaufsquote (verkaufte Teile / (verkaufte Teile + Lagerbestand

-- wenn Stückliste, dann alle Komponenten anzeigen und ganz oben die Gesamtsumme der Kinder
-- Wenn Std Artikel, dann auch anzeigen
-- (wenn komponente von SL -> Dann alle SLs auch anzeigen)
--


-- Vaterartikel bei Varkombis
SELECT
  'Vater (kumuliert)' AS 'Artikeltyp',
  jArtikel.cArtNr AS ArtNr,
        CONCAT('(Vater kumuliert) ', jArtikel.cName) AS Artikelname,
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar)), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fZulauf)), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(SUM(jLetzte365Tage.absatz), 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar) / (ISNULL(SUM(jLetzte365Tage.absatz), 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(SUM(jLetzte30Tage.absatz), 0) AS 'Absatz 30 Tage',
        ISNULL(SUM(jLetzte90Tage.absatz), 0) AS 'Abs. 90 Tage',
        ISNULL(SUM(jLetzte365Tage.absatz), 0) AS 'Abs. 365 Tage',
        ISNULL(SUM(jAbsatzGesamt.absatz), 0) AS 'Abs. Gesamt',
        ISNULL(AVG(jVKDurchschnitt.vk), 0) AS 'Ø VK-Brutto',
        CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(AVG(jRetourenGesamt.Retourenquote), 0))), 1), '%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(SUM(jLetzte30Tage.absatz), 0) > 0 OR SUM(vLagerbestandEx.fVerfuegbar) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(SUM(jLetzte30Tage.absatz), 0) / (SUM(vLagerbestandEx.fVerfuegbar) + ISNULL(SUM(jLetzte30Tage.absatz), 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Abverkaufsquote (Monat)'
FROM tartikel
JOIN
(SELECT tartikel.kArtikel, cArtNr, tArtikelBeschreibung.cName
 FROM tartikel
 JOIN dbo.tSpracheUsed ON nStandard = 1
 JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
  AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
  AND tArtikelBeschreibung.kPlattform=1
 WHERE tartikel.kArtikel = @Key
) AS jArtikel ON jArtikel.kArtikel = @Key
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        (ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100 as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key
GROUP BY kVaterArtikel, jArtikel.cArtNr, jArtikel.cName

UNION -- Kindartikel
SELECT
  '-Kindartikel' AS 'Artikeltyp',
  tartikel.cArtNr AS ArtNr,
        tArtikelBeschreibung.cName AS Artikelname,      
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key

UNION -- Standardartikel
SELECT
  CASE
   WHEN tartikel.kStueckliste > 0 THEN 'Stückliste'
   ELSE 'Standardartikel'
  END  AS 'Artikeltyp',
  tartikel.cArtNr AS ArtNr,
  CASE
   WHEN tartikel.kStueckliste > 0 THEN CONCAT('(Stückliste) ', tArtikelBeschreibung.cName)
   ELSE tArtikelBeschreibung.cName
  END AS Artikelname,
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel = @Key
 AND nIstVater = 0

UNION -- Stücklistenkomponenten
SELECT
  '-Komponente' AS 'Artikeltyp',
  tartikel.cArtNr AS ArtNr,
        tArtikelBeschreibung.cName AS Artikelname,      
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel IN (SELECT tStueckliste.kArtikel FROM tartikel JOIN tStueckliste ON tStueckliste.kStueckliste = tartikel.kStueckliste WHERE tartikel.kArtikel = @Key)
 AND nIstVater = 0
ORDER BY Artikeltyp DESC, ArtNr
Nettes Script.
Wie bekomme ich auf die schnelle die Spalte "Artikeltyp" ganz nach rechts verschoben, und die Spalte "Artikelname" entfernt?
 

John

Sehr aktives Mitglied
3. März 2012
2.743
542
Berlin
@arich001 probier mal das...

Code:
-- wenn Vaterartikel, dann ganz oben auch die gesamtsumme aller kinder
-- ergänzen um  Abverkaufsquote (verkaufte Teile / (verkaufte Teile + Lagerbestand

-- wenn Stückliste, dann alle Komponenten anzeigen und ganz oben die Gesamtsumme der Kinder
-- Wenn Std Artikel, dann auch anzeigen
-- (wenn komponente von SL -> Dann alle SLs auch anzeigen)
--


-- Vaterartikel bei Varkombis
SELECT 
    jArtikel.cArtNr AS ArtNr,
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar)), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fZulauf)), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(SUM(jLetzte365Tage.absatz), 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar) / (ISNULL(SUM(jLetzte365Tage.absatz), 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(SUM(jLetzte30Tage.absatz), 0) AS 'Absatz 30 Tage',
        ISNULL(SUM(jLetzte90Tage.absatz), 0) AS 'Abs. 90 Tage',
        ISNULL(SUM(jLetzte365Tage.absatz), 0) AS 'Abs. 365 Tage',
        ISNULL(SUM(jAbsatzGesamt.absatz), 0) AS 'Abs. Gesamt',
        ISNULL(AVG(jVKDurchschnitt.vk), 0) AS 'Ø VK-Brutto',
        CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(AVG(jRetourenGesamt.Retourenquote), 0))), 1), '%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(SUM(jLetzte30Tage.absatz), 0) > 0 OR SUM(vLagerbestandEx.fVerfuegbar) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(SUM(jLetzte30Tage.absatz), 0) / (SUM(vLagerbestandEx.fVerfuegbar) + ISNULL(SUM(jLetzte30Tage.absatz), 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Abverkaufsquote (Monat)',
  'Vater (kumuliert)' AS 'Artikeltyp'
FROM tartikel
JOIN
(SELECT tartikel.kArtikel, cArtNr, tArtikelBeschreibung.cName
 FROM tartikel
 JOIN dbo.tSpracheUsed ON nStandard = 1
 JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
  AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
  AND tArtikelBeschreibung.kPlattform=1
 WHERE tartikel.kArtikel = @Key
) AS jArtikel ON jArtikel.kArtikel = @Key
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        (ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100 as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key
GROUP BY kVaterArtikel, jArtikel.cArtNr, jArtikel.cName

UNION -- Kindartikel
SELECT 
    tartikel.cArtNr AS ArtNr, 
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)',
  '-Kindartikel' AS 'Artikeltyp'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key

UNION -- Standardartikel
SELECT 
  tartikel.cArtNr AS ArtNr,
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)',
    CASE
     WHEN tartikel.kStueckliste > 0 THEN 'Stückliste'
     ELSE 'Standardartikel'
    END  AS 'Artikeltyp' 
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel = @Key
 AND nIstVater = 0

UNION -- Stücklistenkomponenten
SELECT 
    tartikel.cArtNr AS ArtNr,     
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)',
  '-Komponente' AS 'Artikeltyp'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel IN (SELECT tStueckliste.kArtikel FROM tartikel JOIN tStueckliste ON tStueckliste.kStueckliste = tartikel.kStueckliste WHERE tartikel.kArtikel = @Key)
 AND nIstVater = 0
ORDER BY Artikeltyp DESC, ArtNr
 
  • Gefällt mir
Reaktionen: arich001

arich001

Gut bekanntes Mitglied
21. April 2021
188
15
@arich001 probier mal das...

Code:
-- wenn Vaterartikel, dann ganz oben auch die gesamtsumme aller kinder
-- ergänzen um  Abverkaufsquote (verkaufte Teile / (verkaufte Teile + Lagerbestand

-- wenn Stückliste, dann alle Komponenten anzeigen und ganz oben die Gesamtsumme der Kinder
-- Wenn Std Artikel, dann auch anzeigen
-- (wenn komponente von SL -> Dann alle SLs auch anzeigen)
--


-- Vaterartikel bei Varkombis
SELECT
    jArtikel.cArtNr AS ArtNr,
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar)), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fZulauf)), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(SUM(jLetzte365Tage.absatz), 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, SUM(vLagerbestandEx.fVerfuegbar) / (ISNULL(SUM(jLetzte365Tage.absatz), 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(SUM(jLetzte30Tage.absatz), 0) AS 'Absatz 30 Tage',
        ISNULL(SUM(jLetzte90Tage.absatz), 0) AS 'Abs. 90 Tage',
        ISNULL(SUM(jLetzte365Tage.absatz), 0) AS 'Abs. 365 Tage',
        ISNULL(SUM(jAbsatzGesamt.absatz), 0) AS 'Abs. Gesamt',
        ISNULL(AVG(jVKDurchschnitt.vk), 0) AS 'Ø VK-Brutto',
        CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(AVG(jRetourenGesamt.Retourenquote), 0))), 1), '%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(SUM(jLetzte30Tage.absatz), 0) > 0 OR SUM(vLagerbestandEx.fVerfuegbar) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(SUM(jLetzte30Tage.absatz), 0) / (SUM(vLagerbestandEx.fVerfuegbar) + ISNULL(SUM(jLetzte30Tage.absatz), 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Abverkaufsquote (Monat)',
  'Vater (kumuliert)' AS 'Artikeltyp'
FROM tartikel
JOIN
(SELECT tartikel.kArtikel, cArtNr, tArtikelBeschreibung.cName
 FROM tartikel
 JOIN dbo.tSpracheUsed ON nStandard = 1
 JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
  AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
  AND tArtikelBeschreibung.kPlattform=1
 WHERE tartikel.kArtikel = @Key
) AS jArtikel ON jArtikel.kArtikel = @Key
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        (ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100 as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key
GROUP BY kVaterArtikel, jArtikel.cArtNr, jArtikel.cName

UNION -- Kindartikel
SELECT
    tartikel.cArtNr AS ArtNr,
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)',
  '-Kindartikel' AS 'Artikeltyp'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE kVaterArtikel = @Key

UNION -- Standardartikel
SELECT
  tartikel.cArtNr AS ArtNr,
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)',
    CASE
     WHEN tartikel.kStueckliste > 0 THEN 'Stückliste'
     ELSE 'Standardartikel'
    END  AS 'Artikeltyp'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel = @Key
 AND nIstVater = 0

UNION -- Stücklistenkomponenten
SELECT
    tartikel.cArtNr AS ArtNr,    
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar), 2) AS 'Verfügbar',
        ROUND(CONVERT(FLOAT, vLagerbestandEx.fZulauf), 2) AS 'Zulauf',
        CASE
            WHEN ISNULL(jLetzte365Tage.absatz, 0) > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, vLagerbestandEx.fVerfuegbar / (ISNULL(jLetzte365Tage.absatz, 0) / 365)), 1), ' Tage')
            ELSE 'unendlich'
        END AS 'Lagerreichweite',
        ISNULL(jLetzte30Tage.absatz, 0) AS 'Absatz 30 Tage',
        ISNULL(jLetzte90Tage.absatz, 0) AS 'Abs. 90 Tage',
        ISNULL(jLetzte365Tage.absatz, 0) AS 'Abs. 365 Tage',
        ISNULL(jAbsatzGesamt.absatz, 0) AS 'Abs. Gesamt',
        ISNULL(jVKDurchschnitt.vk, 0) AS 'Ø VK-Brutto',
        ISNULL(jRetourenGesamt.Retourenquote, '0%') AS 'Retourenquote',
        CASE
            WHEN ISNULL(jLetzte30Tage.absatz, 0) > 0 OR vLagerbestandEx.fVerfuegbar > 0 THEN CONCAT(ROUND(CONVERT(FLOAT, (ISNULL(jLetzte30Tage.absatz, 0) / (vLagerbestandEx.fVerfuegbar + ISNULL(jLetzte30Tage.absatz, 0)) * 100)), 1), '%')
            ELSE '-'
        END AS 'Aberkaufsquote (Monat)',
  '-Komponente' AS 'Artikeltyp'
FROM tartikel
JOIN dbo.tSpracheUsed ON nStandard = 1
JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tartikel.kArtikel
    AND tArtikelBeschreibung.kSprache = tSpracheUsed.kSprache
    AND tArtikelBeschreibung.kPlattform=1
JOIN vLagerbestandEx ON vLagerbestandEx.kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -30, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte30Tage ON jLetzte30Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -90, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte90Tage ON jLetzte90Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
        AND tBestellung.dErstellt > DATEADD(DAY, -365, getdate())
    GROUP BY tArtikel_kArtikel
) AS jLetzte365Tage ON jLetzte365Tage.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jAbsatzGesamt ON jAbsatzGesamt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
    SELECT tArtikel_kArtikel, ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS vk
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY tArtikel_kArtikel
) AS jVKDurchschnitt ON jVKDurchschnitt.tArtikel_kArtikel = tartikel.kArtikel
LEFT JOIN (
SELECT jabsatzgesamt.tArtikel_kArtikel,
        CONCAT((ISNULL(retourengesamt.rm, 0.0)/jabsatzgesamt.absatz)*100, '%') as Retourenquote
FROM
(SELECT tArtikel_kArtikel,
    ROUND(CONVERT(FLOAT, ISNULL(SUM(tbestellpos.nAnzahl), 0.0)), 2) AS absatz
    FROM tbestellung
    JOIN tbestellpos ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    WHERE tbestellung.cType = 'B'
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    GROUP BY tArtikel_kArtikel) AS jabsatzgesamt
LEFT JOIN
    (SELECT kArtikel,
        ROUND(CONVERT(FLOAT, ISNULL(SUM(tRMRetourePos.fAnzahl), 0.0)), 2) AS rm
    FROM tbestellung
    JOIN tRMRetoure ON tRMRetoure.kBestellung = tBestellung.kBestellung
    JOIN tRMRetourePos ON tRMRetourePos.kRMRetoure = tRMRetoure.kRMRetoure
    GROUP BY kArtikel) AS retourengesamt on retourengesamt.kArtikel=jabsatzgesamt.tArtikel_kArtikel)
        as jRetourenGesamt on jRetourenGesamt.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel IN (SELECT tStueckliste.kArtikel FROM tartikel JOIN tStueckliste ON tStueckliste.kStueckliste = tartikel.kStueckliste WHERE tartikel.kArtikel = @Key)
 AND nIstVater = 0
ORDER BY Artikeltyp DESC, ArtNr
Merci :)
 
Ähnliche Themen
Titel Forum Antworten Datum
SQL Abfrage für verkaufte Artikel + aktueller Bestand JTL-Wawi 1.8 1
Neu SQL Fehler - Woher stammt diese Abfrage JTL-Shop - Fehler und Bugs 5
Neu SQL Abfrage User helfen Usern - Fragen zu JTL-Wawi 3
Neu Korrektes Datumsformat in SQL-Abfrage User helfen Usern - Fragen zu JTL-Wawi 2
Neu Probleme beim Abfrage kopieren von SQL Management Studio User helfen Usern - Fragen zu JTL-Wawi 1
Datenbank-Abfrage per SQL nach Lagermenge pro Artikel & Warenbereich (WMSLager) JTL-Wawi 1.8 1
Beantwortet #GEFUNDEN# Suche jemand , der uns eine (automatische) SQL Abfrage erstellen kann mit Mail Ausgabe Dienstleistung, Jobs und Ähnliches 2
Minimale Benutzerrechte SQL User für täglichen operativen Betrieb JTL-Wawi 1.9 10
Neu Plattform Feld per SQL setzen - mehrere Marken unter einer Firma verkaufen User helfen Usern - Fragen zu JTL-Wawi 5
Neu Workflow - SQL - Frage zur DATEADD()-Funktion User helfen Usern - Fragen zu JTL-Wawi 2
Neu Wie kann man Anzahl der VPE per SQL abfragen? User helfen Usern - Fragen zu JTL-Wawi 1
Neu Kundendatenimport via SQL JTL-Wawi 1.6 1
Neu SQL Ausgabe Bestellinformationen JTL Ameise - Eigene Exporte 4
Neu SQL Script - geänderte Tabellen. User helfen Usern - Fragen zu JTL-Wawi 3
Wie kann ich etwas in der WAWI Datenbank per SQL ändern? JTL-Wawi 1.8 2
Neu Logfile: SQL Fehler, aber warum? JTL-Shop - Fehler und Bugs 2
Neu Erstinstallation JTL WaWi 1.8.12 - heruntergeladen wird SQL Express 2017 _statt_ der empfohlenen 2022 Version Installation von JTL-Wawi 8
Neu MS SQL Server 2022 oder MS SQL Server 2022 Express? Installation von JTL-Wawi 8
Neu Abfrage des Lieferantenbestands Eigene Übersichten in der JTL-Wawi 4
Neu In bestimmten Artikel, bestimmte Feld wie z.B. Preis für den Ameisen-Import per CSV blockieren Schnittstellen Import / Export 2
Neu JTL-Connector für WooCommerce "kastrieren" (nur Bestände übertragen und Bestellungen abholen) WooCommerce-Connector 3
Neu Kampagne für bing Betrieb / Pflege von JTL-Shop 1
Neu Frage zu Workflow - Schleife für Artikelname und Warengruppe User helfen Usern - Fragen zu JTL-Wawi 3
Neu Änderung der Registrierungsweise für Smart-Funnktionen? Installation / Updates von JTL-Shop 1
Neu Keine Steuerzone für -1 OR 2+299-299-1=0+0+0+1 -- hinterlegt! JTL-Shop - Fehler und Bugs 0
Neu Coupon gültig für mehrere Artikel. User helfen Usern - Fragen zu JTL-Wawi 0
Neu Anordnung des Elementes für Anzahl der Ergebnisse für Kategorieseiten User helfen Usern - Fragen zu JTL-Wawi 1
Neu Anfrage: Plugins für Bestellfortschritt und Versandkostengrenze gesucht... Plugins für JTL-Shop 1
Auftrag erfassen, nur eine Zeile für Positionsname? JTL-Wawi 1.9 4
Neu Sammelauftrag zusammenfassen für Rechnung User helfen Usern - Fragen zu JTL-Wawi 3
Neu FBA Umlagerung + Vorschlagsmengenberechnung: Spalte für Artikel- /Gesamtgewicht JTL-Wawi - Ideen, Lob und Kritik 0
Neu 1.9.4.1 Ausgabe Dropdown-Menü für Angebote und Aufträge funktioniert nach Update nicht mehr Installation von JTL-Wawi 3
Neu Einkaufspreise für Produktionsartikel JTL-Plan&Produce - Ideen, Lob und Kritik 2
Workflow für Rechnung automatisch als PDF in Verzeichnis abspeichern JTL-Wawi 1.8 9
Versanddaten-Exportvorlage (nicht EU) für DPD Cloud JTL-Wawi 1.8 0
Neu Variable für Steuernummer in Dokumenten Gelöste Themen in diesem Bereich 7
Neu Angebotslink für Klarna JTL-Wawi - Ideen, Lob und Kritik 2
Neu Versandstaffel für ebay einstellen eBay-Anbindung - Ideen, Lob und Kritik 0
Neu Rabatt für Kinder mit Rabattangabe User helfen Usern - Fragen zu JTL-Wawi 2
In Bearbeitung POS Kassenbuch Eintrag für Konto ist leer / Buchungskonto fehlt Allgemeine Fragen zu JTL-POS 1
Neu Anfrage: Sendy Plugin für JTL Shop 5 Plugins für JTL-Shop 0
Neu Anderer Steuerschlüssel für bestimmte Aufträge / Kunden User helfen Usern - Fragen zu JTL-Wawi 1
Neu URLs für Sprache Englisch nicht generieren Allgemeine Fragen zu JTL-Shop 8
Neu Kundendaten extern verschlüsseln (Für den eigenen Shop) und per Import importieren Technische Fragen zu Plugins und Templates 2
Neu Adressabgleich für Shop5 Plugins für JTL-Shop 5
Welche Tabelle für Trennzeichen? JTL-Wawi 1.8 13
In Bearbeitung Feature Request: Epson USB Stick an Epson TM-M30iii für mehrere Kassen Allgemeine Fragen zu JTL-POS 1
Neu Wie stelle ich ohne viel Aufwand fest, ob meine Plugins nach einem Update für JTL Shop 5.3.1 geeignet ist ? JTL-Shop - Ideen, Lob und Kritik 4
Neu Wokflow für Auftrag im Fehlbestand incl Artikelnummer User helfen Usern - Fragen zu JTL-Wawi 6
Neu Link für Newsletter um ihn im Browser zu öffnen Allgemeine Fragen zu JTL-Shop 0

Ähnliche Themen