Maison >base de données >tutoriel mysql >Comment effectuer une SOMME conditionnelle dans Oracle avec un seuil de réinitialisation ?
SOMME conditionnelle dans Oracle
Lorsque vous travaillez avec des données numériques dans Oracle, il devient souvent nécessaire d'effectuer des calculs conditionnels basés sur certains critères. L'une de ces exigences consiste à exécuter une opération SUM, mais avec une condition pour réinitialiser la somme après qu'elle dépasse un seuil spécifique.
Problème :
Considérez le tableau de données suivant :
A | B |
---|---|
3 | 7 |
7 | 10 |
6 | 16 |
5 | 5 |
9 | 14 |
3 | 17 |
8 | 8 |
L'objectif est d'effectuer une opération SOMME sur la colonne 'B', mais de remettre la somme à zéro chaque fois qu'elle dépasse une valeur de 15. Le résultat souhaité doit apparaître comme :
A | B | Sum |
---|---|---|
3 | 3 | 3 |
7 | 10 | 10 |
6 | 16 | 16 |
5 | 5 | 5 |
9 | 14 | 14 |
3 | 17 | 17 |
8 | 8 | 8 |
Solution 1 : SQL récursif
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;
Solution 2 : Clause de modèle 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;
Ces deux solutions fonctionnent efficacement l'opération SOMME conditionnelle, remettant la somme à zéro chaque fois qu'elle 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!