Volker: SQL-Abfrage: „verschachtelte“ Summen

Beitrag lesen

Hallo zusammen,

ich habe eine Frage bzgl. einer kniffligen SQL-Abfrage, welche über eine Art Bewertungsbogen laufen soll.

Zunächst eine Beschreibung des Szenarios. Ich gebe dabei jede Tabelle mit ihren relevanten Spalten an und kennzeichne Schlüssel durch ein #-Zeichen:

Ich habe mehrere Datensätze in einer Tabelle:
katalog: #idkatalog name

Ein Katalog besteht aus mehreren Kategorien, eine Kategorie kann eindeutig einem Katalog zugeordnet werden. Jede Kategorie hat eine numerische Gewichtung:
kategorie: #idkategorie #katalog_idkatalog gewichtung

Eine Kategorie besteht aus mehreren Parametern, ein Parameter kann eindeutig einer Kategorie zugeordnet werden. Jeder Parameter hat eine numerische Gewichtung und eine maximal zu erreichende Punktzahl:
parameter: #idparameter #kategorie_idkategorie gewichtung maximalpunkte

Um einen Objekt zu bewerten, existiert eine Tabelle, die jedem Objekt eine erreichte Punktzahl pro Parameter zuordnet:
objekt: #idobjekt #parameter_idparameter punkte

Ich will am Ende der SQL-Abfrage für ein gegebenes Objekt (!) einen numerischen Wert pro Katalog als Ergebnis haben, wie folgt:

  1. Pro Parameter werden die erreichten Punkte durch die Maximalpunkte des Parameters geteilt und mit der Gewichtung des Parameters multipliziert, das Ergebnis hier als Parameterbewertung bezeichnet.
  2. Pro Kategorie wird die Summe aller Parameterbewertungen durch die Summe aller Parametergewichtungen geteilt und mit der Gewichtung der Kategorie multipliziert, das Ergebnis hier als Kategoriebewertung bezeichnet.
  3. Pro Katalog wird die Summe aller Kategoriebewertungen durch die Summe aller Kategoriegewichtungen geteilt.

Meine SQL-Abfrage deckt 1) und 2) ab, aber bei der Ergänzung der Abfrage zu 3) stehe ich auf dem Schlauch, denn ich bekomme die Summe aus 3) nicht integriert:

SELECT katalog.name, SUM(objekt.punkte / parameter.maximalpunkte * parameter.gewichtung) / SUM(parameter.gewichtung) * kategorie.gewichtung  
FROM objekt, parameter, kategorie, katalog  
WHERE objekt.idobjekt = **OBJEKTID**  
  AND objekt.parameter_idparameter = parameter.idparameter  
  AND parameter.kategorie_idkategorie = kategorie.idkategorie  
  AND kategorie.katalog_idkatalog = katalog.idkatalog  
GROUP BY kategorie.idkategorie

Diese Abfrage gibt mir nun für jede Kategorie Schritt 2) zurück. Wie komme ich zu Schritt 3)?

Ich weiß, es ist viel Text, wenn sich da einer durcharbeiten und mir helfen kann, bin ich sehr dankbar.

Viele Grüße

Volker