Heim  >  Artikel  >  Datenbank  >  Wie berechnet man eine bedingte SUMME in Oracle mit einem Reset-Schwellenwert?

Wie berechnet man eine bedingte SUMME in Oracle mit einem Reset-Schwellenwert?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 17:22:30955Durchsuche

How to Calculate a Conditional SUM in Oracle with a Reset Threshold?

Bedingte SUMME in Oracle-Datenbanken

Oracle bietet robuste Funktionalität für die bedingte Aggregation, einschließlich bedingter SUM-Berechnungen. Dieser Artikel befasst sich mit der Herausforderung, eine solche SUMME durchzuführen, mit einer spezifischen Anforderung: Setzen Sie den akkumulierten Wert zurück, wenn er 15 überschreitet.

Problemstellung

Das Ziel ist die Berechnung eine bedingte SUMME über eine Reihe von Werten, wobei die SUMME immer dann auf Null zurückgesetzt wird, wenn sie 15 erreicht oder überschreitet. Diese Aggregation führt zu einer Folge von SUMMEN, die durch den Schwellenwert aufgeteilt sind.

Lösung: Verwendung von MODEL-Klausel

Während rekursives SQL ein praktikabler Ansatz ist, bietet die SQL-MODELL-Klausel eine Alternative, die die Lesbarkeit verbessert und den Ausführungsprozess rationalisiert.

<code class="sql">-- Create a table to represent the sample data
CREATE TABLE test_data ( sort_col VARCHAR2(1), addend NUMBER );
-- Insert sample data
INSERT INTO test_data (sort_col, addend) VALUES ('A', 3), ('B', 7), ('C', 6), ('D', 5), ('E', 9), ('F', 3), ('G', 8);

-- Begin the actual solution
WITH sorted_inputs AS (
  SELECT sort_col,
         ROW_NUMBER() OVER (ORDER BY sort_col) AS sort_order,
         addend,
         0 AS running_sum_max_15  -- Initialize running sum to zero
  FROM test_data
)
SELECT sort_col,
       addend,
       running_sum_max_15
FROM sorted_inputs
MODEL
DIMENSION BY (sort_order)
MEASURES (sort_col, addend, running_sum_max_15)
RULES UPDATE (
  running_sum_max_15[1] = addend[1],  -- Set initial running sum to the first addend
  running_sum_max_15[sort_order > 1] =  -- Calculate running sum for subsequent rows
  CASE
    WHEN running_sum_max_15[CV(sort_order) - 1] < 15 THEN
      running_sum_max_15[CV(sort_order) - 1]  -- Continue running sum if below threshold
    ELSE
      0  -- Reset running sum if threshold is reached or exceeded
  END + addend[CV(sort_order)]  -- Add current addend to running sum
);</code>

Ergebnisse

Die Abfrage erzeugt die folgende Ausgabe:

<code class="sql">+----------+--------+--------------------+
| SORT_COL | ADDEND | RUNNING_SUM_MAX_15 |
+----------+--------+--------------------+
| A        |      3 |                  3 |
| B        |      7 |                 10 |
| C        |      6 |                 16 |
| D        |      5 |                  5 |
| E        |      9 |                 14 |
| F        |      3 |                 17 |
| G        |      8 |                  8 |
+----------+--------+--------------------+</code>

Wie offensichtlich ist, wird die bedingte SUMME korrekt berechnet, wobei die laufende Summe nach Erreichen von 15 von vorne beginnt.

Das obige ist der detaillierte Inhalt vonWie berechnet man eine bedingte SUMME in Oracle mit einem Reset-Schwellenwert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn