Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Mengira SUM Bersyarat dalam Oracle dengan Ambang Tetapan Semula?

Bagaimana untuk Mengira SUM Bersyarat dalam Oracle dengan Ambang Tetapan Semula?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 17:22:30958semak imbas

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

SUM Bersyarat dalam Pangkalan Data Oracle

Oracle menyediakan fungsi yang mantap untuk pengagregatan bersyarat, termasuk pengiraan SUM bersyarat. Artikel ini menangani cabaran untuk melaksanakan SUM sedemikian, dengan keperluan khusus: tetapkan semula nilai terkumpul apabila melebihi 15.

Pernyataan Masalah

Objektifnya adalah untuk mengira SUM bersyarat ke atas siri nilai, di mana SUM ditetapkan semula kepada sifar apabila ia mencapai atau melebihi 15. Pengagregatan ini menghasilkan jujukan SUM yang dibahagikan mengikut nilai ambang.

Penyelesaian: Menggunakan Klausa MODEL

Walaupun SQL rekursif ialah pendekatan yang berdaya maju, klausa MODEL SQL menawarkan alternatif yang meningkatkan kebolehbacaan dan menyelaraskan proses pelaksanaan.

<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>

Keputusan

Pertanyaan menghasilkan output berikut:

<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>

Seperti yang terbukti, SUM bersyarat dikira dengan betul, dengan jumlah larian bermula semula selepas mencapai 15.

Atas ialah kandungan terperinci Bagaimana untuk Mengira SUM Bersyarat dalam Oracle dengan Ambang Tetapan Semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn