Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Melakukan SUM Bersyarat dalam Oracle dengan Ambang Tetapan Semula?

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

DDD
DDDasal
2024-10-29 08:00:03241semak imbas

How to Perform a Conditional SUM in Oracle with a Resetting Threshold?

SUM Bersyarat dalam Oracle

Apabila bekerja dengan data berangka dalam Oracle, selalunya menjadi perlu untuk melakukan pengiraan bersyarat berdasarkan kriteria tertentu. Satu keperluan sedemikian adalah untuk melaksanakan operasi SUM, tetapi dengan syarat untuk menetapkan semula jumlah selepas ia melebihi ambang tertentu.

Masalah:

Pertimbangkan jadual data berikut :

A B
3 7
7 10
6 16
5 5
9 14
3 17
8 8

Objektifnya adalah untuk melaksanakan operasi SUM pada lajur 'B', tetapi tetapkan semula jumlah kepada sifar apabila ia melebihi nilai 15. Output yang diingini akan muncul sebagai:

A B Sum
3 3 3
7 10 10
6 16 16
5 5 5
9 14 14
3 17 17
8 8 8

Penyelesaian 1: SQL Rekursif

WITH recursive_sums AS (
    SELECT A, B, B AS SUM_VALUE
    FROM data_table
    UNION ALL
    SELECT A, B, CASE WHEN SUM_VALUE + B < 15 THEN SUM_VALUE + B ELSE 0 END AS SUM_VALUE
    FROM recursive_sums
    WHERE A < (SELECT MAX(A) FROM data_table)
)
SELECT A, B, SUM_VALUE AS Sum
FROM recursive_sums
ORDER BY A;

Penyelesaian 2: Klausa MODEL SQL

WITH sorted_inputs AS (
    SELECT A, ROW_NUMBER() OVER (ORDER BY A) AS sort_order, B, 0 AS running_sum_max_15
    FROM data_table
),
sorted_results AS (
    SELECT A, B, running_sum_max_15
    FROM sorted_inputs
    MODEL
    DIMENSION BY (sort_order)
    MEASURES (A, B, running_sum_max_15)
    RULES UPDATE
    (
        running_sum_max_15[1] = B[1],
        running_sum_max_15[sort_order > 1] = CASE WHEN running_sum_max_15[CV(sort_order) - 1] < 15 THEN running_sum_max_15[CV(sort_order) - 1] ELSE 0 END + B[CV(sort_order)]
    )
)
SELECT A, B, running_sum_max_15 AS Sum
FROM sorted_results
ORDER BY A;

Kedua-dua penyelesaian ini berkesan operasi SUM bersyarat, menetapkan semula jumlah kepada sifar apabila ia melebihi ambang 15.

Atas ialah kandungan terperinci Bagaimana untuk Melakukan 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