SQL-Statement

Hoppel

Aktiver Benutzer
Beiträge
38
Hallo,

ist folgendes mit SQL möglich:

Ich habe zwei Tabellen Bestellungen (Belegnummer, Adressnummer (vom Kunden), Datum, Artikelnummer, Menge, Einzelpreis) und Artikel (Artikelnummer, Einkaufspreis).

Ich möchte all diejenigen Artikelnummern, Absatzmenge und Anzahl der Kunden zurückgegeben haben, die in einem bestimmten Zeitraum ( ab dem 1. März 2016) gekauft wurden, aber die Mengen von Kunden, die den Artikel vor diesem Zeitraum gekauft haben, sollen nicht mit berechnet werden.

Mit anderen Worten:

"Welcher Artikel wurde zu welcher Menge seit dem 1. März 2016 "neu" gekauft?"

"Neu" bedeutet in diesem Zusammenhang, wurde vorher von Kunde X nicht gekauft.

Code:
SELECT   a.Artikelnummer,
     isnull(sum(b.menge),0) AS Absatzmenge,
     isnull(count(DISTINCT b.adressnummer),0) AS AnzahlKunden
FROM   Artikel a
LEFT JOIN Bestellungen b
ON     a.Artikelnummer = b.Artikelnummer
AND     convert(DATE,b.datum) BETWEEN '01.03.2016' AND '01.01.2017'
group by a.Artikelnummer

Dieses Statement gibt mir jetzt alle Artikel zurück, aber es wird die Absatzmenge von Kunden mitgerechnet, die den Artikel bereits vor dem 1.3. bestellt haben.

Ich hoffe ihr habt verstanden was mein Problem ist. Es ist sehr kompliziert zu erklären und ich stoße an meine Grenzen.

Wenn diese gewünschte Abfrage mit SQL möglich ist, würde ich mich über Anregungen/Ideen/Vorschläge sehr freuen.
 
Werbung:
Ich bin mir nicht ganz sicher ob ich alles verstehe. Du könntest dein Ziel (glaube ich) auf unterschiedlichen Wegen erreichen:
a) du nimmst einen INNER JOIN und bekommst nur die Datensätze aus a, zu denen es auch Daten in b gibt.
b) du nimmst convert(DATE,b.datum) BETWEEN '01.03.2016' AND '01.01.2017' aus der Join-Condition und setzt es in ein WHERE, was aber im Prinzip a entspricht
c) du arbeitest im Select-Teil mit CASE-Schleifen um nur die Werte zu berücksichtigen, die auch später in der Summe landen sollen oder die Summe nur unter bestimmten Voraussetzungen anzuzeigen. Ich kenne deine Datenstruktur nicht so gut, daher bin ich mir nicht sicher ob hier die Ursache liegt.
 
Guten Morgen,

also so sehen meine Statements aus:

a):

Code:
SELECT   a.Artikelnummer,
     isnull(sum(b.menge),0) AS Absatzmenge,
     isnull(count(DISTINCT b.adressnummer),0) AS AnzahlKunden
FROM   Artikel a
LEFT JOIN Bestellungen b
ON     a.Artikelnummer = b.Artikelnummer
WHERE convert(DATE,b.datum) BETWEEN '01.03.2016' AND '01.01.2017'
group by a.Artikelnummer

b):

Code:
SELECT   a.Artikelnummer,
     isnull(sum(b.menge),0) AS Absatzmenge,
     isnull(count(DISTINCT b.adressnummer),0) AS AnzahlKunden
FROM   Artikel a
INNER JOIN Bestellungen b
ON     a.Artikelnummer = b.Artikelnummer
AND  convert(DATE,b.datum) BETWEEN '01.03.2016' AND '01.01.2017'
group by a.Artikelnummer

Bei beiden Statements ist das Ergebnis das selbe wie zuvor und es ist nicht die richtige Datenmenge, die ich gerne hätte. Vorschlag c) habe ich nicht ganz verstanden. Habe ich einen der beiden Vorschläge von dir falsch interpretiert?
 
Gib mal bitte aus Artikel zwei Beispieldatensätze mit den zugehörigen Daten aus Bestellungen. Einen der mit einbezogen werden soll und einen der fälschlicherweise mit einbezogen wird.
 
Code:
Adressnummer    Datum    Artikelnummer    VE    Menge    Katalogpreis    Belegnummer    Einzelpreis
Kunde A    2016-05-23 00:00:00.000   abc    NULL    4    1,15    LIE16/162711    1,15
Kunde B    2016-05-04 00:00:00.000    abc        NULL    2400    1,15    LIE16/161915    0,56
Kunde B    2016-05-04 00:00:00.000    abc        NULL    600    1,15    LIE16/161915    0,56
Kunde C     2016-04-18 00:00:00.000    abc        NULL    50    1,15    LIE16/160983    1,15
Kunde B    2016-04-18 00:00:00.000    abc        NULL    1200    1,15    LIE16/161029    0,56
Kunde B    2016-03-23 00:00:00.000    abc        NULL    2000    1,15    LIE16/159784    0,56
Kunde B    2016-02-11 00:00:00.000    abc        50    2000    1,15    LIE16/157766    0,6

Kunde B soll nicht drin sein, da er am 11.2.2016 schon etwas bestellt hat. Kunde C und A hingegen sollen drin sein.
 
Artikel:

Artikelnummer Einkaufspreis
abc 0,44

Bestellungen:

wie in Post #5, das ist einfacher select * from Bestellungen where artikelnummer ='abc' Befehl gewesen.
 
Okay jetzt begreife ich auch was du machen willst: Du musst nochmal eine Abfrage auf die Tabelle Bestellungen machen um zu ermitteln, welche Kunden welche Artikel aus deiner eigentlichen Auswertung schonmal gekauft haben um eben diese dann nicht zu berücksichtigen.
Code:
SELECT   a.Artikelnummer,
     isnull(sum(b.menge),0) AS Absatzmenge,
     isnull(count(DISTINCT b.adressnummer),0) AS AnzahlKunden
FROM   Artikel a
INNER JOIN Bestellungen b
ON     a.Artikelnummer = b.Artikelnummer
WHERE   b.Adressnummer NOT IN (   SELECT   Adressnummer
                 FROM   Bestellungen
                 WHERE   Adressnummer IS NOT NULL
                 AND     Artikelnummer = a.Artikelnummer
                 AND     convert(DATE,Datum) < '01.03.2016' )
GROUP BY a.Artikelnummer
So werden alle Datensätze komplett gefiltert, also die Absatzmenge und die Anzahl der Kunden betrifft nur Kunden/Artikel-Kombinationen die erstmalig gekauft wurden.

Wenn trotzdem in anderen Spalten noch alle Datensätze ausgewertet werden sollen, dann musst du mit CASE arbeiten. Das würde ich aber nur empfehlen wenn es nicht anders geht.
 
Werbung:
Zurück
Oben