Informationsverarbeitung 2 - Sommersemester 2009

Aktualisiert: 2009.07.20, 09:46 |  login | 
Mittwoch, 17. Juni 2009

.. in der Argumente-Liste.

In der heutigen Lehrveranstaltung, als Vorbereitung für die praktische Prüfung gedacht, wurde über die Formulierung einer SQL-Abfrage auf die Buchhandels-Übungsdatenbank nachgedacht, welche eine Kunden-Umsatzliste ergibt.

Genau genommen, wird eine Liste aller Kunden-Umsätze gefordert, welche neben der Nummer und dem Namen des Kunden, auch dessen Gesamtumsatz ausweist und die Zahl der Aufträge, die zum ausgewiesenen Umsatz führten.

Ein erster Entwurf könnte folgendermaßen aussehen:

SELECT Kunde.Nr as Kundennummer,
Kunde.Nachname as Kundenname,
round(sum( Auftragspos.Menge * Buch.Preis ), 2) as Umsatz,
count(Auftrag.Nr ) as Aufträge
FROM Kunde, Auftrag, Auftragspos, Buch
WHERE Kunde.Nr = Auftrag.Kundennummer
AND Auftrag.Nr = Auftragspos.Auftragsnummer
AND Auftragspos.Buchnummer = Buch.Nr
GROUP BY Kunde.Nr

Die Rudimentäre Kenntnis des Datenbestandes jedoch lässt am erzielten Ergebnis zweifeln. Kunde Schäfer (Nr. 2) z.B. hat seinen Gesamtumsatz nie - wie aber ausgewiesen - mit 61 Aufträgen erzielt. Dieser Umstand lässt sich leicht, wie folgt überprüfen:

SELECT Auftrag.Nr, Auftrag.Datum
FROM Auftrag
Where Auftrag.Kundennummer=2

Das Ergebnis zeigt, dass Kunde "Schäfer" mit der Kundennummer "2" genau 4 Aufträge erteilt hat und nicht mehr.

Die ermittelte Anzahl von 61 Aufträgen scheint demnach das Kreuzprodukt aus Aufträgen und Auftragspositionen zu sein. Diese Behauptung lässt sich leicht durch die nachfolgende Abfrage überprüfen:

Select Auftrag.Nr, Auftragspos.Buchnummer
FROM Auftrag, Auftragspos
Where Auftrag.Nr=Auftragspos.Auftragsnummer
AND Auftrag.Kundennummer=2

Oder eben in der Kurzform:

Select Count(Auftrag.Nr) FROM Auftrag, Auftragspos
Where Auftrag.Nr=Auftragspos.Auftragsnummer
AND Auftrag.Kundennummer=2

Wie lautet nun die Auflösung?

Um zu verhindern, dass sich die Count-Funktion auf das Kreuzprodukt bezieht und stattdessen jeden Auftrag nur ein mal ZÄHLT wird die Distinct-Klausel bemüht. Diese befindet sich im Falle der Anwendung auf eine Count-Funktion in der Liste der Argumente:

 

SELECT Kunde.Nr as Kundennummer,
Kunde.Nachname as Kundenname,
round(sum( Auftragspos.Menge * Buch.Preis ), 2) as Umsatz,
count(DISTINCT Auftrag.Nr ) as Aufträge
FROM Kunde, Auftrag, Auftragspos, Buch
WHERE Kunde.Nr = Auftrag.Kundennummer
AND Auftrag.Nr = Auftragspos.Auftragsnummer
AND Auftragspos.Buchnummer = Buch.Nr
GROUP BY Kunde.Nr

 

... permalink  ... comment

Menu
Suche
 
Aktuelle Kommentare
Präsentation
Anscheinend hat die Verlinkung zu meinem Blog hier...
by cornelia.degeneve.Uni-Linz (2009.07.20, 09:46)
Präsentation Lieferantenanalyse
Meine Präsentation ist hier zu finden. Lg Andrea
by Andrea.Winkler.Uni-Linz (2009.07.02, 23:29)
Präsentation
Hier kann man meine Präsentation downloaden.   Lg...
by Nina.Krapf.Uni-Linz (2009.06.28, 13:49)
Präsentation des...
hier ist der Link zum Download von meiner Präsentation
by Markus_Eder.Uni-Linz (2009.06.26, 16:25)
Präsentation
In meinem BLOG kann man die Präsentation herunterladen. lg...
by Zedin.Sisic.Uni-Linz (2009.06.26, 16:10)

xml version of this page

made with antville
nach oben |  startseite |  kategorien |