ottscho
Goto Top

SQL Statment - Neukunden ermittlen

Hallo zusammen,

ich habe bei unserem Datenbank das Problem, dass ich gerne Neukunden ermittelt hätte, aber nicht nach Anlagedatum des Kunden, sondern nach Erstauftrag bzw Erstangebot.

Hier mal vereinfacht die beiden Tabellen Struktur.

Kunden: Kundennummer / Kundenname
Angebote: Angebotid / Kundennummer / Bezeichnung / Angebotsdatum

Kunden.Kundennummer = Angebote.Kundennummer (1:N Verbindung)


Nun möchte ich z.B. alle Kunden bekommen, die im Monat Oktober zum ersten Mal (also könnte auch 5 Anfragen sein) eine Anfrage bekommen haben, aber davor noch nie!
Probleme macht mir die Möglichkeit, dass der Kunde im Monat Oktober auch mehr als nur eine Anfrage bekommen haben könnte...

Mein Statment bis jetzt:

SELECT newOffer0.Kundennummer
  FROM Aufträge as newOffer0
WHERE (
SELECT COUNT(*) as Anzahl 
FROM (SELECT newOffer1.* FROM Aufträge WHERE statecode = 0) as newOffer1
WHERE newOffer0.Kundennummer = newOffer1.Kundennummer]
GROUP BY newOffer1.Kundennummer]
) = 1
AND Angebotsdatum between '2009-10-01' and '2009-10-31'  


So, jetzt zählt er alle Angebote im Oktober und als Nebenabfrage alle Angebote in dem kompletten Stamm, und überall wo es nur 1 Angebot gezählt wurde, ist es ein Neukunde bzw. ein Kunde der im Monat Oktober zum ersten Mal eine Anfrage bekommen hat. Aber wenn der Kunde mehrere Angebote im Oktober bekommen hat, wird er nicht angezeigt.

Wie kann ich das Problem lösen?

Danke
Gruß
ottscho

Content-Key: 129687

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

Printed on: April 25, 2024 at 14:04 o'clock

Member: bytecounter
bytecounter Nov 18, 2009 at 13:52:37 (UTC)
Goto Top
Hallo,

ohne jetzt näher auf Dein SQL Statement einzugehen, die Anzahl aller Angebote muss mit den Angeboten aus dem Monat übereinstimmen und die Anzahl muss > 0 sein:

COUNT(*) as Anzahl = Angebotsdatum between '2009-10-01' and '2009-10-31' AND Anzahl > 0


vg
Bytecounter
Member: ottscho
ottscho Nov 18, 2009 at 14:06:58 (UTC)
Goto Top
Aber die Unterabfrage bezieht sich ja auf den kompletten Datenbestand. und dann werden mir auch die Kunden angezeigt, die vor dem Monat Oktober schon eine Anfrage bekommen haben.
Genau das möchte ich nicht...
Member: bytecounter
bytecounter Nov 18, 2009 at 15:17:12 (UTC)
Goto Top
Nein, wird nicht. Es werden nur die Kunden angezeigt, die mehr als 0 Bestellungen getätigt haben und die Anzahl der gesamten Bestellungen = der Anzahl der Bestellungen in dem genannten Monat ist.
Hat der Kunde vorher schon bestellt, dann ist Anzahl Gesamtbestellungen > Bestellungen des Monats und die Bedingung ist nicht erfüllt.
Member: ottscho
ottscho Nov 18, 2009 at 15:30:39 (UTC)
Goto Top
ok, habe ich verstanden. aber es pass nicht oben in mein statment.
müsste dass dann so aussehen?

SELECT newOffer0.Kundennummer
  FROM Aufträge as newOffer0
WHERE (
SELECT COUNT(*) as Anzahl 
FROM (SELECT newOffer1.* FROM Aufträge WHERE statecode = 0) as newOffer1
WHERE newOffer0.Kundennummer = newOffer1.Kundennummer]
GROUP BY newOffer1.Kundennummer]
) = (Select COUNT(*) from Aufträge WHERE Angebotsdatum between '2009-10-01' and '2009-10-31' AND Anzahl > 0 )   
AND Angebotsdatum between '2009-10-01' and '2009-10-31'  

irgendwie checks ich gerade nicht mehr...
Member: bytecounter
bytecounter Nov 18, 2009 at 15:45:17 (UTC)
Goto Top
Das Statement passt auch nicht zu Deiner oben genannten Struktur. Du hast einmal newOffer0 und newOffer1.
Solange ich nicht weiß, was aus welcher Tabelle wie gewertet werden soll, kann ich das Statement nicht optimieren.
Member: MadMax
MadMax Nov 18, 2009 at 18:17:54 (UTC)
Goto Top
Moin ottscho,

Dein Select hab ich mir mal nicht angetan, das klingt mir für die Aufgabenstellung zu kompliziert. Ich such mir einfach das erste Angebot und les den Kunden dazu, das war doch das Gewünschte, oder?

Da ich Deine Tabellen nicht da habe und auch nicht weiß, was Du überhaupt für eine DB hast, ist das Ganze natürlich ungetestet, sollte aber so passen:
select	k.*, a.MinDatum
from	Kunden k
	join (	select	Kundennummer, min (Angebotsdatum) "MinDatum"  
		from	Angebote
		group by Kundennummer
		) a on k.Kundennummer = a.Kundennummer
where	a.MinDatum between '2009-10-01' and '2009-10-31'  

Gruß, Mad Max
Member: ottscho
ottscho Nov 19, 2009 at 08:31:31 (UTC)
Goto Top
oh man, ist ja easy... vielen dank.
mit min(date) funktioniet es natürlich ganz einfach...

danke
Grüße
ottscho