Maison  >  Article  >  base de données  >  Comment effectuer une sommation conditionnelle dans Oracle avec un seuil de réinitialisation ?

Comment effectuer une sommation conditionnelle dans Oracle avec un seuil de réinitialisation ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-29 18:53:30174parcourir

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

SOMMATION conditionnelle dans Oracle : réinitialisation des valeurs lorsque la limite dépasse 15

Dans Oracle, vous pouvez rencontrer des scénarios dans lesquels vous devez additionner des valeurs de manière conditionnelle et réinitialisez la somme lorsqu'elle atteint un seuil spécifique. Par exemple, supposons que vos données soient représentées dans un tableau comme suit :

A | 3 | 3
B | 7 | 10
C | 6 | 16  -- ====
D | 5 | 5
E | 9 | 14
F | 3 | 17  -- ====
G | 8 | 8

Objectif : Écrivez une requête qui calcule la somme cumulée des valeurs, en la réinitialisant à zéro chaque fois que la somme dépasse 15.

Solution utilisant la clause SQL MODEL

Une alternative au SQL récursif pour ce problème consiste à utiliser la clause SQL MODEL. La syntaxe peut paraître plus complexe, mais elle peut offrir de la clarté dans certains cas :

-- Create a temporary table for demonstration purposes
with test_data ( sort_col, addend ) as
( SELECT 'A', 3 FROM DUAL UNION ALL
 SELECT 'B', 7 FROM DUAL UNION ALL
 SELECT 'C', 6 FROM DUAL UNION ALL
 SELECT 'D', 5 FROM DUAL UNION ALL
 SELECT 'E', 9 FROM DUAL UNION ALL
 SELECT 'F', 3 FROM DUAL UNION ALL
 SELECT 'G', 8 FROM DUAL ),

-- Implementation of the conditional summation using MODEL clause
sorted_inputs ( sort_col, sort_order, addend, running_sum_max_15) as
( SELECT sort_col, row_number() over ( order by sort_col ) sort_order, addend, 0 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],
  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+addend[CV(sort_order)]
)

Résultats :

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

Cette requête effectue efficacement la sommation conditionnelle, remise à zéro du cumul à chaque fois qu'il dépasse le seuil de 15.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn