Nützliche SQL Abfragen für den Buchhandel
Mit den folgenden Befehlen habe ich bereits versucht, wichtige Daten für die Veränderung des Buchhandels herauszufiltern:

In meiner ersten Abfrage werden alle Bücher angezeigt, von denen weniger als 5 Stück verkauft wurden. So sollen Ladenhüter ausgeforscht werden und der Buchhandel kann darüber nachdenken, diese Bücher aus dem Sortiment zu nehmen. Der Befehl dazu lautet wie folgt:

SELECT DISTINCT Buch.Titel, Buch.Verlag, Verlag.Name,
SUM(Auftragspos.Menge) AS Menge
FROM Buch, Auftragspos, Verlag
WHERE Buch.Nr=Auftragspos.Buchnummer
AND Buch.Verlag=Verlag.Kurzbezeichnung
GROUP BY Buch.Titel
HAVING Menge<5



Um speziell auf die kundenreichsten Bereiche Oberösterreichs eingehen zu können und gezielt in diesen Orten neue Vertriebswege zu finden, soll die folgende Abfrage die Anzahl der Kunden in den Städten und Dörfern Oberösterreichs herausfiltern:

SELECT COUNT(Kunde.Nachname) AS Kundenanzahl, PLZ.Plz, PLZ.Ort
FROM PLZ, Kunde
WHERE Kunde.Plz=PLZ.Plz
AND PLZ.Plz LIKE '4%'
GROUP BY PLZ.Plz



Gesucht wird nach den Umsätzen der verschiedenen Verlage. Der Buchhandel bezieht vermutlich die meisten Bücher von den umsatzstärksten Verlagen – vielleicht können durch die große Menge noch bessere Konditionen ausgehandelt werden?

SELECT Verlag.Name, Verlag.Plz, PLZ.Ort,
SUM(Auftragspos.Menge)*Buch.Preis AS Umsatz
FROM Verlag, Buch, Auftragspos, PLZ
WHERE Verlag.Plz=PLZ.Plz
AND Verlag.Kurzbezeichnung=Buch.Verlag
AND Buch.Nr=Auftragspos.Buchnummer
GROUP BY Verlag.Name
ORDER BY Umsatz DESC



Diese Abfrage führt zu einer Liste der Autoren mit dem Anfangsbuchstaben K und ihrem zugehörigen Verlag:

SELECT DISTINCT Buch.Autor, Verlag.Name
FROM Verlag, Buch
WHERE Verlag.Kurzbezeichnung=Buch.Verlag
AND Buch.Autor LIKE 'K%'
ORDER BY Verlag.Name ASC



Welche Kunden haben wie viele Bücher gekauft? Besonders treue Kunden könnten mit speziellen Angeboten belohnt werden.

SELECT Kunde.*, PLZ.Ort,
SUM(Auftragspos.Menge) AS 'Verkaufte Bücher'
FROM PLZ, Kunde, Auftrag, Auftragspos
WHERE Kunde.Plz=PLZ.Plz
AND Kunde.Nr=Auftrag.Kundennummer
AND Auftrag.Nr=Auftragspos.Auftragsnummer
GROUP BY Kunde.Nachname



Bei meiner letzten Abfrage soll sich der Buchhandel darüber Gedanken machen, wie viele Kunden er in den einzelnen Bundesländern hat und wie viel Umsatz er in den jeweiligen Ländern macht.

SELECT COUNT(Kunde.Nr) AS 'Anzahl der Kunden',
SUM(Auftragspos.Menge)*Buch.Preis AS Umsatz, PLZ.Region
FROM Kunde, PLZ, Verlag, Buch, Auftragspos
WHERE Kunde.Plz=PLZ.Plz
AND PLZ.Plz=Verlag.Plz
AND Verlag.Kurzbezeichnung=Buch.Verlag
AND Buch.Nr=Auftragspos.Buchnummer
GROUP BY PLZ.Region

Kommentieren




reinhard.joechtl.Uni-Linz, Mittwoch, 29. Oktober 2008, 19:02
Sehr gute Arbeit - und deine Beispiele machen auch noch richtig Sinn! *top*

Verena.Kraus.Uni-Linz, Donnerstag, 30. Oktober 2008, 10:40
Danke :) als blutiger Anfänger in Sql ist das ja gar nicht so einfach ...

Eines habe ich allerdings nicht verstanden: bei meiner letzten Abfrage (wie viel Umsatz, wie viele Kunden in welchen Regionen gemacht haben) da kommt dann nur was zu Oberösterreich und Wien. Habe ich da einen Fehler in meinem Befehl oder bedeuted das nur, dass in den anderen Regionen nichts verkauft wurde (müsste dann nicht bei Umsatz einfach nur 0 stehen)??? Vielleicht hat jemand einen Tipp für mich ...

Übrigens ein kleiner Hinweis für die anderen Kollegen: Wenn ihr eine Überschrift kreieren wollt mit mehr als einem Wort, dann nehmt nicht die "richtigen Anführungszeichen", sondern 'diese hier'. Funktioniert zwar in der Übungsdatenbank, nicht aber mit Javascript. Habe selber über eine Stunde gebraucht, bis ich draufgekommen bin weshalb meine Befehle auf dem Blog nicht funktionieren ... :( wollt euch das ersparen.

LG

reinhard.joechtl.Uni-Linz, Donnerstag, 30. Oktober 2008, 14:47
Also vom blutigen Anfänger merkt man da aber nix - du hast immerhin einen Join über 5 Tabellen gemacht. ;)

Bei der letzten Abfrage verstehe ich nicht ganz, weshalb der Verlag in der Abfrage ist.
Jedenfalls hab ich hier den korrekten Befehl für dich:
SELECT COUNT(Kunde.Nr) AS 'Anzahl der Kunden', SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz, PLZ.Region
FROM Kunde, Auftrag, Auftragspos, Buch, PLZ
WHERE Kunde.Plz=PLZ.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr
GROUP BY PLZ.Region


Zum letzten Absatz noch: Korrekterweise dürfen wir hier nicht von JavaScript sprechen, weil unsere Version eine reine HTML-Lösung ist. JavaScript würde uns zB: noch mehr Möglichkeiten beim "Gestalten" des auf Knopfdruck geöffneten Fensters bieten.
Jedenfalls, wie von dir schon richtig angemerkt, muss die Query single quotation marks enthalten, weil sonst das Value-Attribut des Formulars (welches den Abfrage-Befehl an den SQL-Server sendet) zu früh geschlossen und die Formularübergabe ungültig wird.

Verena.Kraus.Uni-Linz, Donnerstag, 30. Oktober 2008, 16:02
Achja :) Vielen Dank für den Hinweis! Der Verlag hat hier wirklich nichts verloren, man braucht stattdessen die Tabelle Auftrag. Dann möchte ich hier also den richtigen Befehl ausführen:


Hans.Mittendorfer.Uni-Linz, Donnerstag, 30. Oktober 2008, 11:45
Vorbildhaft !

Danke auch für die Beteiligung an der Diskussion und die Hinweise über die An- uns Ausführungszeichen. Eben diese hier: " oder '

Im Namen aller Studierenden, die am Thema "SQL" arbeiten.

H. Mittendorfer