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 ?

Comment puis-je implémenter une SOMME conditionnelle dans Oracle qui se réinitialise à zéro lorsque le total cumulé dépasse 15 ?

DDD
Libérer: 2024-10-29 11:46:02
original
575 Les gens l'ont consulté

How can I implement a conditional SUM in Oracle that resets to zero when the running total exceeds 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 :

  1. Définissez un CTE (Common Table Expression) nommé sorted_inputs pour classer les données d'entrée par ordre croissant.
  2. Introduisez une colonne nommée running_sum_max_15 pour suivre le total cumulé, initialisé à 0 pour toutes les lignes.
  3. Utilisez la clause RULES UPDATE pour définir les règles de calcul :

    • Pour la première ligne, définissez running_sum_max_15 sur addend.
    • Pour les lignes suivantes, vérifiez si la valeur précédente de running_sum_max_15 est inférieure à 15. Si c'est vrai, ajoutez-y l'addend actuel ; sinon, réinitialisez le décompte à 0 et ajoutez l'addition actuelle.

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>
Copier après la connexion

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 |
+----------+--------+--------------------+
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal