Gelöst Artikelverwaltung > Artikelverkauf je Kunde

BPD_MR

Aktives Mitglied
13. September 2017
81
10
Hi guys,
auch wir finden die neuen Möglichkeiten unendlich geil, leider spricht hier keiner ordentlich SQL...
Könntet Ihr bitte die Query zur Verfügung stellen, die beim Artikel anzeigt von welchem Kunden er wie oft gekauft wurde?
Würde uns vor allem bei frischen Artikeln gut weiterhelfen...
vielen Dank & big up!!
 
Zuletzt bearbeitet:

Thomas Lisson

Administrator
Mitarbeiter
24. März 2006
15.574
299
Köln
Moin,
Könntet Ihr bitte die Query zur Verfügung stellen, die beim Artikel anzeigt von welchem Kunden er wie oft gekauft wurde?
Jop, bitteschön:

Abverkauf pro Kunde.png

SQL:
-- Standardartikel
SELECT
    tArtikel.cArtNr AS 'ArtNr',
    tKunde.cKundenNr AS Kundennummer,
    CONCAT(tAdresse.cVorname, ' ', tAdresse.cName, ' ', tAdresse.cFirma) AS Kunde,
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKNetto), 0.0)), 2) AS 'Ø VK-Netto',
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS 'Ø VK-Brutto',    
    COUNT(DISTINCT(tBestellung.kBestellung)) AS Auftraege,
    ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl)), 2) AS Gesamtmenge,
    CASE
        WHEN COUNT(DISTINCT(tBestellung.kBestellung)) > 0 THEN ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl) / COUNT(DISTINCT(tBestellung.kBestellung))), 2)
        ELSE 0
    END AS 'Ø Menge pro Kauf',
    MAX(tBestellung.dErstellt) AS 'Letzter Kauf'
FROM tbestellpos
JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
JOIN tKunde ON tBestellung.tKunde_kKunde = tkunde.kKunde
JOIN tAdresse ON tAdresse.kKunde = tkunde.kKunde
JOIN tartikel ON tartikel.kArtikel = tbestellpos.tArtikel_kArtikel
WHERE tartikel.kArtikel = @Key
    AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    AND tbestellung.cType = 'B'
GROUP BY    
            tbestellung.tKunde_kKunde,
            tartikel.kVaterArtikel,
            tKunde.cKundenNr,
            tAdresse.cVorname,
            tAdresse.cName,
            tAdresse.cFirma,
            tArtikel.cArtNr

-- Vaterartikel bei Varkombis
UNION
SELECT
    CONCAT('Alle Kinder von: ', jArtikel.cArtNr) AS 'ArtNr',
    tKunde.cKundenNr AS Kundennummer,
    CONCAT(tAdresse.cVorname, ' ', tAdresse.cName, ' ', tAdresse.cFirma) AS Kunde,
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKNetto), 0.0)), 2) AS 'Ø VK-Netto',
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS 'Ø VK-Brutto',    
    COUNT(DISTINCT(tBestellung.kBestellung)) AS Auftraege,
    ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl)), 2) AS Gesamtmenge,
    CASE
        WHEN COUNT(DISTINCT(tBestellung.kBestellung)) > 0 THEN ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl) / COUNT(DISTINCT(tBestellung.kBestellung))), 2)
        ELSE 0
    END AS 'Ø Menge pro Kauf',
    MAX(tBestellung.dErstellt) AS 'Letzter Kauf'
FROM tbestellpos
JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
JOIN tKunde ON tBestellung.tKunde_kKunde = tkunde.kKunde
JOIN tAdresse ON tAdresse.kKunde = tkunde.kKunde
JOIN tartikel ON tartikel.kArtikel = tbestellpos.tArtikel_kArtikel
JOIN
(SELECT tartikel.kArtikel, cArtNr
    FROM tartikel
    WHERE tartikel.kArtikel = @Key
) AS jArtikel ON 1=1
WHERE tartikel.kVaterArtikel = @Key
    AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    AND tbestellung.cType = 'B'
GROUP BY    
            tbestellung.tKunde_kKunde,
            tartikel.kVaterArtikel,
            tKunde.cKundenNr,
            tAdresse.cVorname,
            tAdresse.cName,
            tAdresse.cFirma,
            jArtikel.cArtNr
ORDER BY 'Letzter Kauf' DESC
Edit am 28.11.2019:
- Auswahl eines Vaterartikels wertet alle Kindartikelverkäufe aus
- VK Netto und VK Brutto werden beide nun angezeigt
 
Zuletzt bearbeitet:

redheadman

Gut bekanntes Mitglied
3. August 2016
171
24
Berlin
Wäre es möglich in die Query oben auch eine Spalte mit dem VK netto Preis einzufügen!

Vielen Dank

Denke das sollte passen:

Code:
SELECT
    tartikel.cArtNr AS ArtNr,
    jVerkaufProKunde.Kundennummer,
    jVerkaufProKunde.Kunde,
    jVerkaufProKunde.vk AS 'Ø VK-Netto',
    jVerkaufProKunde.Auftraege,
    jVerkaufProKunde.Gesamtmenge,
    jVerkaufProKunde.DurchschnittProKauf AS 'Ø Menge pro Kauf',
    CONVERT(VARCHAR, jVerkaufProKunde.LetzterKauf, 104) AS 'Letzter Kauf'
FROM tartikel
LEFT JOIN (
    SELECT    tArtikel_kArtikel,
            tKunde.cKundenNr AS Kundennummer,
            CONCAT(tAdresse.cVorname, ' ', tAdresse.cName, ' ', tAdresse.cFirma) AS Kunde,
            ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKNetto), 0.0)), 2) AS vk,
            COUNT(DISTINCT(tBestellung.kBestellung)) AS Auftraege,
            ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl)), 2) AS Gesamtmenge,
            CASE
                WHEN COUNT(DISTINCT(tBestellung.kBestellung)) > 0 THEN ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl) / COUNT(DISTINCT(tBestellung.kBestellung))), 2)
                ELSE 0
            END AS DurchschnittProKauf,
            MAX(tBestellung.dErstellt) AS LetzterKauf
    FROM tbestellpos
    JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
    JOIN tKunde ON tBestellung.tKunde_kKunde = tkunde.kKunde
    JOIN tAdresse ON tAdresse.kKunde = tkunde.kKunde
    WHERE tbestellpos.tArtikel_kArtikel = @Key
        AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
        AND tbestellung.cType = 'B'
    GROUP BY    tbestellung.tKunde_kKunde,
                tArtikel_kArtikel,
                tKunde.cKundenNr,
                tAdresse.cVorname,
                tAdresse.cName,
                tAdresse.cFirma
) AS jVerkaufProKunde ON jVerkaufProKunde.tArtikel_kArtikel = tartikel.kArtikel
WHERE tartikel.kArtikel = @Key
ORDER BY jVerkaufProKunde.LetzterKauf DESC
 

designer

Offizieller Servicepartner
SPBanner
20. Juli 2009
256
17
@Thomas Lisson
Beim Listview gibt es noch folgenden Fehler:
- Artikel wird in Auftrag zugefügt (Preis z.B. 380.-)
- Anschliessend wird später der Preis angepasst (Preis z.B. 340.-) und via POS verkauft
- Es wird in der Auswertung der Ursprüngliche Preis (Preis z.B. 380.-) genommen, und nicht der angepasste (Preis z.B. 340.-) was dem tatsächlichen Verkaufspreis entspricht.
 

mariox

Aktives Mitglied
6. Januar 2018
49
4
Hallo,

ist richtig Klasse. Könnte man den SQL Code noch mit "Verkaufsplattformen" und "Lieferländer" erweitern?
 

FEAL

Aktives Mitglied
26. Februar 2017
46
7
Vielen Dank erstmal, für die tolle Abfrage!
Ich hab allerdings einen Fehler entdeckt. In der Liste sind manche Kunden mehrmals aufgeführt. Dadurch passiert folgendes:

Ein Kunde von mir hat 4 x Bestellt, die Menge in der Liste ist mit 50 Angegeben was korrekt ist.
Dadurch dass er 2 in der Liste auftaucht, ist zudem noch der Gleiche Kunde mit der Menge 100 angegeben.

Ich glaube ich hab den Fehler auch gefunden. Wenn ein Kunden mehrere Lieferadressen hat, steht er mehrmals in der Liste drin. Für jede Lieferadresse steht dann die Menge in der Liste und zusätzlich wird alles noch addiert.

Wäre super, wenn der Fehler noch behoben werden könnte!

Lieben Dank!
 
  • Gefällt mir
Reaktionen: mitscho

designer

Offizieller Servicepartner
SPBanner
20. Juli 2009
256
17
Die Berechnung der Spalten "Gesamtmenge" und "Menge pro Kauf" sind fehlerhaft, es werden falsche Werte ausgegeben, siehe Screenshot
Ticket_5880_2K.jpg
 

redheadman

Gut bekanntes Mitglied
3. August 2016
171
24
Berlin
Hallo,
finde es bis jetzt alles Super, aber kann man auch anstatt dem Ø VK-Netto Preis, den wirklich letzten Netto Verkaufspreis anzeigen lassen?

Beste Grüße
 

Thomas Lisson

Administrator
Mitarbeiter
24. März 2006
15.574
299
Köln
Hi zusammen,

ist richtig Klasse. Könnte man den SQL Code noch mit "Verkaufsplattformen" und "Lieferländer" erweitern?
Meinst du das macht an der Stelle Sinn Verkaufsplattformen und Lieferländer anzuzeigen? Aktuell ist die Ansicht ja pro Kunde angesetzt. Passiert es wirklich so oft, dass ein und derselbe Kunde unterschiedliche Verkaufsplattformen oder Lieferländer nutzt? Es wäre wohl hier besser folgende LVE zu nutzen: https://forum.jtl-software.de/threads/artikelverwaltung-aktivitaet-pro-plattform.123458/

Beim Listview gibt es noch folgenden Fehler:
- Artikel wird in Auftrag zugefügt (Preis z.B. 380.-)
- Anschliessend wird später der Preis angepasst (Preis z.B. 340.-) und via POS verkauft
- Es wird in der Auswertung der Ursprüngliche Preis (Preis z.B. 380.-) genommen, und nicht der angepasste (Preis z.B. 340.-) was dem tatsächlichen Verkaufspreis entspricht.
Hmm, die Abfrage bezieht sich auf das, was im Auftrag unter Verkaufspreis steht. Wenn du das so über POS verkaufst, wie sieht der Auftrag in der Wawi dazu aus?

Ich hab allerdings einen Fehler entdeckt. In der Liste sind manche Kunden mehrmals aufgeführt.
Vielen Dank dafür, Fehler wurde beseitigt und korrigiert ganz oben im Beitrag #2 im SQL.

Die Berechnung der Spalten "Gesamtmenge" und "Menge pro Kauf" sind fehlerhaft, es werden falsche Werte ausgegeben, siehe Screenshot
Das wird am gleichen Fehler bei mehreren Adressen pro Kunde gelegen haben. Sollte somit auch gelöst sein.

finde es bis jetzt alles Super, aber kann man auch anstatt dem Ø VK-Netto Preis, den wirklich letzten Netto Verkaufspreis anzeigen lassen?
Das funktioniert leider nicht, da wir beim Markieren eines Vaterartikels pro Kunde dann alle Kindartikel betrachten. Somit kann kein expliziter letzter VK angegeben werden, da der Kunde mehrere Kindartikel des gleichen Vaters gekauft haben kann.
 

designer

Offizieller Servicepartner
SPBanner
20. Juli 2009
256
17
Hi zusammen,


Meinst du das macht an der Stelle Sinn Verkaufsplattformen und Lieferländer anzuzeigen? Aktuell ist die Ansicht ja pro Kunde angesetzt. Passiert es wirklich so oft, dass ein und derselbe Kunde unterschiedliche Verkaufsplattformen oder Lieferländer nutzt? Es wäre wohl hier besser folgende LVE zu nutzen: https://forum.jtl-software.de/threads/artikelverwaltung-aktivitaet-pro-plattform.123458/


Hmm, die Abfrage bezieht sich auf das, was im Auftrag unter Verkaufspreis steht. Wenn du das so über POS verkaufst, wie sieht der Auftrag in der Wawi dazu aus?


Vielen Dank dafür, Fehler wurde beseitigt und korrigiert ganz oben im Beitrag #2 im SQL.


Das wird am gleichen Fehler bei mehreren Adressen pro Kunde gelegen haben. Sollte somit auch gelöst sein.


Das funktioniert leider nicht, da wir beim Markieren eines Vaterartikels pro Kunde dann alle Kindartikel betrachten. Somit kann kein expliziter letzter VK angegeben werden, da der Kunde mehrere Kindartikel des gleichen Vaters gekauft haben kann.

Habe die neuste Version von #2 ausprobiert, die Gesamtmenge stimmen immer noch nicht überein. (Zeitraum von Artikelstatistik erfasst den ganzen Zeitraum des Kunden seit Start mit Wawi)
1586239073353.png
 

mitscho

Gut bekanntes Mitglied
26. Mai 2009
152
22
Vielen Dank erstmal, für die tolle Abfrage!
Ich hab allerdings einen Fehler entdeckt. In der Liste sind manche Kunden mehrmals aufgeführt. Dadurch passiert folgendes:

Ein Kunde von mir hat 4 x Bestellt, die Menge in der Liste ist mit 50 Angegeben was korrekt ist.
Dadurch dass er 2 in der Liste auftaucht, ist zudem noch der Gleiche Kunde mit der Menge 100 angegeben.

Ich glaube ich hab den Fehler auch gefunden. Wenn ein Kunden mehrere Lieferadressen hat, steht er mehrmals in der Liste drin. Für jede Lieferadresse steht dann die Menge in der Liste und zusätzlich wird alles noch addiert.

Wäre super, wenn der Fehler noch behoben werden könnte!

Lieben Dank!

Vielleicht könnte sich Jemand des Fehlers annehmen.
Ich bekomme ebenfalls die Verkäufe mehrfach angezeigt, je nachdem, wie viele Lieferadressen es gibt.
Das macht das Ganze nicht hilfreich

Ich hätte so was auch gerne im Bestellfenster, da man so schnell überprüfen könnte, ob Artikel z.B. nur von einem Kunden gekauft werden und man das bei der Bestellmenge berücksichtigen muss.
 
Zuletzt bearbeitet:

tom10

Sehr aktives Mitglied
2. Oktober 2012
714
107
06774 Muldestausee
Gibt es eventuell hier nochmal eine Korrektor des oben angesprochenen Fehlers?
Erweitere die Bedingungen mal mit AND tBestellung.tAdresse_kAdresse = tAdresse.kAdresse und die Gruppierung mit tAdresse.kAdresse. Damit sollten die verschiedenen Lieferadressen berücksichtigt werden.
SQL:
-- Standardartikel
SELECT
    tArtikel.cArtNr AS 'ArtNr',
    tKunde.cKundenNr AS Kundennummer,
    CONCAT(tAdresse.cVorname, ' ', tAdresse.cName, ' ', tAdresse.cFirma) AS Kunde,
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKNetto), 0.0)), 2) AS 'Ø VK-Netto',
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS 'Ø VK-Brutto',    
    COUNT(DISTINCT(tBestellung.kBestellung)) AS Auftraege,
    ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl)), 2) AS Gesamtmenge,
    CASE
        WHEN COUNT(DISTINCT(tBestellung.kBestellung)) > 0 THEN ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl) / COUNT(DISTINCT(tBestellung.kBestellung))), 2)
        ELSE 0
    END AS 'Ø Menge pro Kauf',
    MAX(tBestellung.dErstellt) AS 'Letzter Kauf'
FROM tbestellpos
JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
JOIN tKunde ON tBestellung.tKunde_kKunde = tkunde.kKunde
JOIN tAdresse ON tAdresse.kKunde = tkunde.kKunde
JOIN tartikel ON tartikel.kArtikel = tbestellpos.tArtikel_kArtikel
WHERE tartikel.kArtikel = @Key
    AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    AND tbestellung.cType = 'B'
    AND tBestellung.tAdresse_kAdresse = tAdresse.kAdresse
GROUP BY    
            tbestellung.tKunde_kKunde,
            tAdresse.kAdresse,
            tartikel.kVaterArtikel,
            tKunde.cKundenNr,
            tAdresse.cVorname,
            tAdresse.cName,
            tAdresse.cFirma,
            tArtikel.cArtNr


-- Vaterartikel bei Varkombis
UNION
SELECT
    CONCAT('Alle Kinder von: ', jArtikel.cArtNr) AS 'ArtNr',
    tKunde.cKundenNr AS Kundennummer,
    CONCAT(tAdresse.cVorname, ' ', tAdresse.cName, ' ', tAdresse.cFirma) AS Kunde,
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKNetto), 0.0)), 2) AS 'Ø VK-Netto',
    ROUND(CONVERT(FLOAT, ISNULL(AVG(tbestellpos.fVKPreis), 0.0)), 2) AS 'Ø VK-Brutto',    
    COUNT(DISTINCT(tBestellung.kBestellung)) AS Auftraege,
    ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl)), 2) AS Gesamtmenge,
    CASE
        WHEN COUNT(DISTINCT(tBestellung.kBestellung)) > 0 THEN ROUND(CONVERT(FLOAT, SUM(tbestellpos.nAnzahl) / COUNT(DISTINCT(tBestellung.kBestellung))), 2)
        ELSE 0
    END AS 'Ø Menge pro Kauf',
    MAX(tBestellung.dErstellt) AS 'Letzter Kauf'
FROM tbestellpos
JOIN tBestellung ON tbestellpos.tBestellung_kBestellung = tBestellung.kBestellung
JOIN tKunde ON tBestellung.tKunde_kKunde = tkunde.kKunde
JOIN tAdresse ON tAdresse.kKunde = tkunde.kKunde
JOIN tartikel ON tartikel.kArtikel = tbestellpos.tArtikel_kArtikel
JOIN
(SELECT tartikel.kArtikel, cArtNr
    FROM tartikel
    WHERE tartikel.kArtikel = @Key
) AS jArtikel ON 1=1
WHERE tartikel.kVaterArtikel = @Key
    AND tBestellung.nStorno = 0 -- Stornierte Aufträge nicht beachten
    AND tbestellung.cType = 'B'
    AND tBestellung.tAdresse_kAdresse = tAdresse.kAdresse
GROUP BY    
            tbestellung.tKunde_kKunde,
            tAdresse.kAdresse,
            tartikel.kVaterArtikel,
            tKunde.cKundenNr,
            tAdresse.cVorname,
            tAdresse.cName,
            tAdresse.cFirma,
            jArtikel.cArtNr
ORDER BY 'Letzter Kauf' DESC
 

aldi

Aktives Mitglied
12. November 2021
6
1
Ist es denn möglich die Plattform von welcher der Verkauf stattgefunden hat, noch mit aus zugeben?

VG Aldi