Maison >base de données >tutoriel mysql >Comment puis-je implémenter une SOMME conditionnelle dans Oracle qui se réinitialise à zéro lorsque le total cumulé dépasse 15 ?
SOMME conditionnelle sur Oracle : réinitialisation lorsque la valeur dépasse 15
Dans Oracle, vous pouvez rencontrer le besoin d'effectuer une somme cumulée mais la restreindre jusqu'à un seuil maximum. Par exemple, vous souhaiterez peut-être calculer un total cumulé qui se réinitialise à zéro chaque fois qu'il dépasse une valeur de 15. C'est ce qu'on appelle une SOMME conditionnelle.
Une approche pour y parvenir consiste à utiliser un code SQL récursif. requête, qui vous permet de mettre à jour de manière itérative les totaux cumulés en fonction d'une condition définie. Cependant, une méthode alternative consiste à utiliser la clause Oracle SQL MODEL.
La clause SQL MODEL offre une solution plus lisible, bien qu'avec une syntaxe légèrement plus complexe. En créant un modèle basé sur les données d'entrée, vous pouvez spécifier des règles pour régir la façon dont les totaux cumulés sont calculés.
Pour implémenter cette SUM conditionnelle à l'aide de la clause SQL MODEL :
Utilisez la clause RULES UPDATE pour définir les règles de calcul :
La sortie de cette requête vous fournira un total cumulé qui se réinitialise à zéro chaque fois qu'il dépasse 15.
Exemple :
<code class="sql">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 ), 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)] );</code>
Sortie :
+----------+--------+--------------------+ | 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 | +----------+--------+--------------------+
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!