Lernblog von Franz Heinzl

Kommentare
das "mehr"-problem hat sich erledigt,... (Julia.Habich.Uni-Linz, 08. Jän)
funkt einwandfrei, nur... (Julia.Habich.Uni-Linz, 08. Jän)
Vorschau (reinhard.joechtl.Uni-Linz, 08. Jän)
Sehr gute Idee, werde ich auch... (patrick.fuehrer.Uni-Linz, 02. Apr)
Hallo, ich hab das RSS-Feed soeben... (Thomas.Penzinger.Uni-Linz, 20. Mär)
3. Hausübung - SQL
Dienstag, 8. April 2008, 21:03
Ausgehend von folgender Abfrage auf SQL.IDV.EDU

SELECT Kunde.Nr, Kunde.Nachname, COUNT(Auftrag.Nr)
FROM Kunde, Auftrag
WHERE Kunde.Nr = Auftrag.Kundennummer
GROUP BY Kunde.Nr
ORDER BY Kunde.Nr


sollte schrittweise eine Auswertung entwicklt werden, die betriebswirtschaftlich wertvolle Aussagen produziert.


Vorgehensweise:

1. Ergänzen der obenstehende Abfrage um den Umsatz (Preis * Menge) je Kunde. Zu beachten ist, dass die Anzahl der getätigten Aufträge "COUNT(Auftrag.Nr)" korrekt ist, bzw. im Vergleich zur Ausgangssituation unverändert.

SELECT Kunde.Nr, Kunde.Nachname, COUNT(DISTINCT Auftrag.Nr) AS 'Anzahl der Einkäufe', SUM(Buch.Preis*Auftragspos.Menge) AS 'Gesamtwert der Einkäufe'
FROM Kunde,Auftrag,Auftragspos,Buch
WHERE (Kunde.Nr=Auftrag.Kundennummer)
AND (Auftrag.Nr=Auftragspos.Auftragsnummer)
AND (Auftragspos.Buchnummer=Buch.Nr)
GROUP BY Kunde.Nr
ORDER BY Kunde.Nr


In dieser Abfrage werden alle Kunden mit der Anzahl an Einkäufen und mit dem Gesamtwert der Einkäufe aufgelistet. Hierbei ist zu berücksichtigen, dass jeder Auftrag nur einmal gezählt wird.
Weitere Information zu COUNT DISTINCT Funktion unter w3schools.


2. Im Weiteren Schritt die Verteilung der Aufträge über die Zeit (Jahre) ermitteln, OHNE dass dabei Auswertungen (Anzahl der Aufträge bzw. Auftragssummen) ermittelt werden.

SELECT Kunde.Nr, Kunde.Nachname, YEAR(Auftrag.Datum)AS 'Jahr', Auftrag.Datum
FROM Kunde,Auftrag
WHERE (Kunde.Nr=Auftrag.Kundennummer)
ORDER BY Kunde.Nr


Es wird zu jedem Einkauf das Jahr angegeben, indem der Auftrag erteilt wurde. Um das Ergebnis besser mit dem Datum vergleichen zu können wurdedie GROUP BY Funktion absichtlich entfernt.


3. Eingrenzen der Abfrage 1 in sinnvolle Zeitabschnitte.

SELECT Kunde.Nr, Kunde.Nachname,
COUNT(DISTINCT Auftrag.Nr)AS 'Anzahl der Einkäufe',
SUM(Buch.Preis*Auftragspos.Menge) AS 'Gesamtwert der Einkäufe',Auftrag.Datum
FROM Kunde,Auftrag,Auftragspos,Buch
WHERE (Kunde.Nr=Auftrag.Kundennummer)
AND (Auftrag.Nr=Auftragspos.Auftragsnummer)
AND (Auftragspos.Buchnummer=Buch.Nr)
AND MONTH(Auftrag.Datum)='1'
GROUP BY Kunde.Nr
ORDER BY Kunde.Nr


Es werden alle Kunden aufgelistet die ihre Einkäufe im Jänner tätigten. Hierbei wird auch die Anzahl der Einkäufe im Jänner sowie der Gesamtwert der Einkäufe ausgegeben.


4. Ergänzen der zeitlich abgegrenzten Auswertungen um einen weiteren Filter, der sich an der durchschnittlichen Anzahl der Aufträge orientiert.

SELECT Kunde.Nr, Kunde.Nachname,
COUNT(DISTINCT Auftrag.Nr)AS 'Anzahl der Einkäufe',
SUM(Buch.Preis*Auftragspos.Menge) AS 'Gesamtwert der Einkäufe',Auftrag.Datum
FROM Kunde,Auftrag,Auftragspos,Buch
WHERE (Kunde.Nr=Auftrag.Kundennummer)
AND (Auftrag.Nr=Auftragspos.Auftragsnummer)
AND (Auftragspos.Buchnummer=Buch.Nr)
AND MONTH(Auftrag.Datum)='1'
GROUP BY Kunde.Nr
HAVING COUNT(DISTINCT Auftrag.Nr)>1
ORDER BY Kunde.Nr

Als weiterer Filter wird die Anzahl der Einkäufe verwendet. Es werden nur noch Kunden aufgelistet die mehr als einmal einen Einkauf getätigt haben.

Kommentieren