SQL Abfrage


Mark Aber

Recommended Posts

Hallo Leute !

Erstmals der Link: http://sql.idv.edu/ -> Interaktive Abfrage

Wie fass ich in dieser Datenbank die Gesamtumsätze der Kunden zusammen.

Ich habs bis jetzt soweit:

Select Auftrag.Kundennummer, Kunde.Vorname, Kunde.Nachname, PLZ.Ort, PLZ.Region,

SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz

From PLZ,Kunde, Auftrag, Auftragspos, Buch

Where Auftrag.Kundennummer=Kunde.Nr and Auftrag.Nr=Auftragspos.Auftragsnummer and Auftragspos.Buchnummer= Buch.Nr and Kunde.Plz=PLZ.Plz

Group by Kundennummer, Vorname, Nachname, Ort, Region, Auftragspos.Menge*Buch.Preis

Order by Kundennummer, Auftragspos.Menge*Buch.Preis DESC, Nachname ASC

da seh ich leider jeden wirklich jeden Einzelumsatz. Irgendwas fehlt noch und ich weiß nicht was :(.

bearbeitet von Mark Aber

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

My rule is never to look at anything on the Internet.

Du hast es ja eh richtig, darfst aber nicht auch noch den Umsatz bei der Gruppierung dabei haben.

Außerdem wäre es besser statt den ganzen WHERE-Bedingungen gleich mittels JOIN die Tabellen zu verbinden. Immerhin hast sonst das kartesische Produkt von allen Tabellen auf du die erst den Filter legst.

SELECT
 Auftrag.Kundennummer,
 Kunde.Vorname, 
 Kunde.Nachname, 
 PLZ.Ort, 
 PLZ.Region,
 SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz
FROM 
 PLZ
 INNER JOIN Kunde ON Kunde.Plz=PLZ.Plz
 INNER JOIN Auftrag ON Auftrag.Kundennummer=Kunde.Nr
 INNER JOIN Auftragspos ON Auftrag.Nr=Auftragspos.Auftragsnummer 
 INNER JOIN Buch ON Auftragspos.Buchnummer=Buch.Nr
GROUP BY
 Auftrag.Kundennummer,
 Kunde.Vorname, 
 Kunde.Nachname, 
 PLZ.Ort, 
 PLZ.Region
ORDER BY
 Auftrag.Kundennummer, 
 Auftragspos.Menge*Buch.Preis DESC, 
 Nachname ASC

bearbeitet von Silva

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hab schon wieder ein Problem. :(

Folgende Aufgabenstellung. Ich soll alle Autoren ausgeben die im Jahr 2000 einen größeren Gesatmumsatz als 45000 machen. Das schräge ist wenn ich bei der Bedingung Buch.Preis*Auftragspos.Menge> 4500 eingib gibt er es mir ohne Probleme aus, wenn ich aber >45000 eingebe, bekomm ich nur eine leere Tabelle. :ratlos: Irgendwas stimmt da grundsätzlich nicht, die Umsatzerte ändern sich wenn ich was anderes eingebe. Hilfe.

select Buch.Autor, SUM(Buch.Preis*Auftragspos.Menge) as Gesamtumsatz

From Buch, Auftragspos, Auftrag

Where Buch.Nr=Auftragspos.Buchnummer and Auftrag.Nr=Auftragspos.Auftragsnummer and Auftrag.Datum between "2000-01-01" and "2000-12-31" and Buch.Preis*Auftragspos.Menge>45000

Group by Buch.Autor

Order by SUM(Buch.Preis*Auftragspos.Menge) desc

bearbeitet von Mark Aber

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Captain Awesome

Hmm, mal auf die Schnelle hast du ein WHERE "Buch.Nr=Auftragspos.Menge" ... da kann schonmal was ned stimmen.

Muss leider grad los, aber ich würde auch die Vorschläge vom Herrn Silva (Joins!) beherzigen.

Falls es bis dahin noch keiner erledigt hab, werd ichs mir am Abend im Detail anschauen. :)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hmm, mal auf die Schnelle hast du ein WHERE "Buch.Nr=Auftragspos.Menge" ... da kann schonmal was ned stimmen.

Muss leider grad los, aber ich würde auch die Vorschläge vom Herrn Silva (Joins!) beherzigen.

Falls es bis dahin noch keiner erledigt hab, werd ichs mir am Abend im Detail anschauen. :)

stimmt, habs gerade ausgebessert ändert sich leider nix.

@Joins: wir habens so "gelehrt" bekommen und sollens so anwenden.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Banklwärmer

select Buch.Autor, SUM(Buch.Preis*Auftragspos.Menge) as Gesamtumsatz

From Buch, Auftragspos, Auftrag

Where Buch.Nr=Auftragspos.Buchnummer and Auftrag.Nr=Auftragspos.Auftragsnummer and Auftrag.Datum between "2000-01-01" and "2000-12-31"

Group by Buch.Autor having (SUM(Buch.Preis*Auftragspos.Menge) > 45000)

Order by SUM(Buch.Preis*Auftragspos.Menge) desc

sollte so stimmen

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

rockstar

@Joins: wir habens so "gelehrt" bekommen und sollens so anwenden.

das passt - abhängig vom DBMS - schon so. ist zwar nicht ANSI-konform, aber doch ein impliziter join. oracle und co. sind so gscheit, dass da mit hash joins/nested loops gearbeitet wird bzw. kartesianer nur dann eingesetzt werden, wenn es sinn macht.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

My rule is never to look at anything on the Internet.

das passt - abhängig vom DBMS - schon so. ist zwar nicht ANSI-konform, aber doch ein impliziter join. oracle und co. sind so gscheit, dass da mit hash joins/nested loops gearbeitet wird bzw. kartesianer nur dann eingesetzt werden, wenn es sinn macht.

Stimmt schon, aber warum auf die Datenbank und ihre Optimierungen verlassen, wenn es (einfache) Konstrukte gibt, die das auch für den User deutlich machen, dass da eine Tabelle mit der anderen auf der Spalte verbunden werden?

Edit: Mir persönlich sind die JOINS lieber, auch wenn es vielleicht keine Vorteile hat, weil die meisten DBMS eh schon so viel rundherum optimieren, so gibt es ja auch keine Nachteile. Zumindest hätt ich bislang nix davon gehört.

bearbeitet von Silva

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

rockstar

Stimmt schon, aber warum auf die Datenbank und ihre Optimierungen verlassen, wenn es (einfache) Konstrukte gibt, die das auch für den User deutlich machen, dass da eine Tabelle mit der anderen auf der Spalte verbunden werden?

Edit: Mir persönlich sind die JOINS lieber, auch wenn es vielleicht keine Vorteile hat, weil die meisten DBMS eh schon so viel rundherum optimieren, so gibt es ja auch keine Nachteile. Zumindest hätt ich bislang nix davon gehört.

richtig - vor-/nachteile bzgl. verhalten des optimizers hat keine der beiden varianten, das ist wirklich geschmackssache. im gegensatz zu dir finde ich z.b. die implizite variante um einiges übersichtlicher ;)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...


  • Folge uns auf Facebook

  • Partnerlinks

  • Unsere Sponsoren und Partnerseiten

  • Wer ist Online

    • Keine registrierten Benutzer online.