Die SQL MODEL-Klausel (nur in Oracle verfügbar) erlaubt es, Daten in einer Art multidimensionalem Array (ähnlich einem Spreadsheet) zu modellieren und komplexe, iterative Berechnungen in einer einzigen Abfrage durchzuführen.
Definiert werden bei der MODEL Klausel:
- PARTITION BY – Die Gruppierung, in der das Modell separat berechnet wird (z. B. pro Abteilung).
- DIMENSION BY – Die Indizes bzw. Schlüssel, die die „Zeilen“ in der Modellmatrix identifizieren (z. B. Mitarbeitenden-ID, aber auch zusätzliche Dimensionen wie Perioden für Simulationen).
- MEASURES – Die zu berechnenden Kennzahlen, für die Sie Ausgangswerte definieren (z. B. Gehalt, initialer Bonus).
- RULES – Die Berechnungsregeln, die auch iterative und bedingte Zuweisungen beinhalten können.
Dadurch können innerhalb einer einzigen SQL-Abfrage Szenarien modelliert werden, die normalerweise mehrere Schritte oder gar prozeduralen Code erfordern würden – von einfachen Berechnungen (z. B. 10 % Bonus) bis hin zu komplexen Szenarioanalysen wie Gehaltsprognosen, alternativen Bonusmodellen oder Budgetplanungen.
Beispiel 1: Einfaches Bonusmodell (10 % des Gehalts)
Hier wird der Bonus pro Mitarbeiter innerhalb jeder Abteilung als 10 % des Gehalts berechnet.
WITH TestData AS
(
SELECT 201 empno, 1100 deptno, 1000 salary, 0 bonus FROM DUAL UNION ALL
SELECT 202 empno, 1100 deptno, 2000 salary, 0 bonus FROM DUAL UNION ALL
SELECT 203 empno, 1200 deptno, 3000 salary, 0 bonus FROM DUAL UNION ALL
SELECT 204 empno, 1300 deptno, 4000 salary, 0 bonus FROM DUAL
)
SELECT deptno, salary, bonus
FROM TestData
MODEL
PARTITION BY (deptno) -- Gruppiert die Daten nach Abteilung
DIMENSION BY (empno) -- Identifiziert jede Zeile (Mitarbeiter) anhand der Mitarbeiternummer
MEASURES (salary, 0 bonus) -- Ausgangswerte: Gehalt aus der Tabelle, Bonus initial 0
RULES (
bonus[ANY] = salary[CV()] * 0.1 -- Bonus = 10% vom Gehalt
);