srob: Problem mit komplizierter SQL-Abfrage:

Beitrag lesen

Hallo Andreas,

Ich habe 2 Tabellen, Bestellungen(allgemeine Daten pro Bestellung) und Bestelldaten(alle einzelnen bestellten Produkte, hier wird die zugehörige Bestellungs-ID gespeichert).
In der Tabelle Bestellungen habe ich die Lieferanten ID gespeichert, und jetzt suche ich die Summe aller Preise (die in der Tabelle Bestelldaten gespeichert sind) die einer bestimmten Lieferanten ID zugeordnet sind. Etwas kompliziert(formuliert:), leichter ist das mit der Abfrage, die ich probiert habe:

SELECT sum(t1.Preis)
FROM Bestelldaten AS t1
LEFT JOIN Bestellungen AS t2 ON t1.Bestellungen_ID = t2.ID
GROUP BY t1.Preis
HAVING t2.Lieferanten_ID = $Lieferanten_ID

ich komme zwar von anderen SQL-Dialekten, aber vielleicht geht es so:

SELECT be.ID,sum(bd.Preis)
      FROM Bestelldaten AS bd,Bestellungen AS be
      WHERE bd.Bestellungen_ID = be.ID
      GROUP BY bd.Bestellungen_ID

Das kommt von undurchsichtiger Nomenklatur! So sollte es aussehen:

SELECT be.ID,sum(bd.Preis)
       FROM Bestelldaten AS bd,Bestellungen AS be
       WHERE bd.Bestellungen_ID = be.ID
       GROUP BY be.ID

Dabei ist dieses AS in der FROM-Klausel sicher nicht ANSI-konform. Außerdem könnte Deine Nomenklatur (Tabellen- und Spaltennamen) aussagekräftiger sein; ich mußte dreimal nachlesen, bevor ich eine Ahnung bekam - bin immer noch nicht sicher - was Bestelldaten und was Bestellungen überhaupt bedeutet. Wenn Du eine 1:n-Beziehung abbildest, könntest Du zum Beispiel mit den Präfixen "M" für Master und "C" für Child arbeiten, dann weiß jeder Fachmann sofort, was gemeint ist.

group by Preis hab ich núr so geschrieben, da ich in Erinnerung hatte, das man da was schreiben muß, da SUM einfach mit where nicht geht.

Die GROUP-BY-Klausel verwendet man nicht einfach so, sondern sie sagt dem SELECT, nach welchem Kriterium die Spaltenqualifizierer angewendet werden sollen; in diesem Fall also, über welche Menge von DS die Summenbildung vorgenommen werden soll.

Die Notwendigkeit für JOINS und die HAVING-Klausel erkenne ich nicht - sofern ich die Aufgabenstellung richtig interpretiert habe.

HTH Robert