首页 >数据库 >mysql教程 >如何在 Oracle 中实现条件 SUM,当运行总计超过 15 时重置为零?

如何在 Oracle 中实现条件 SUM,当运行总计超过 15 时重置为零?

DDD
DDD原创
2024-10-29 11:46:02573浏览

How can I implement a conditional SUM in Oracle that resets to zero when the running total exceeds 15?

Oracle 上的条件 SUM:值超过 15 时重置

在 Oracle 中,您可能会遇到需要执行累加求和但对其进行限制的情况到最大阈值。例如,您可能想要计算一个运行总计,该总计在超过值 15 时重置为零。这称为条件 SUM。

实现此目的的一种方法是使用递归 SQL查询,它允许您根据定义的条件迭代更新运行总计。然而,另一种方法涉及利用 Oracle SQL MODEL 子句。

SQL MODEL 子句提供了更具可读性的解决方案,尽管语法稍微复杂一些。通过基于输入数据创建模型,您可以指定规则来控制运行总计的计算方式。

要使用 SQL MODEL 子句实现此条件 SUM:

  1. 定义一个CTE(通用表表达式)命名为sorted_inputs,用于按升序对输入数据进行排序。
  2. 引入一个名为running_sum_max_15的列来跟踪运行总计,所有行都初始化为0。
  3. 使用 RULES UPDATE 子句定义计算规则:

    • 对于第一行,将 running_sum_max_15 设置为加数。
    • 对于后续行,检查 running_sum_max_15 的先前值是否小于15. 如果为 true,则将当前加数添加到其中;否则,将计数重置为 0 并添加当前加数。

此查询的输出将为您提供一个运行总计,只要超过 15,该总计就会重置为零。

示例:

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

输出:

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

以上是如何在 Oracle 中实现条件 SUM,当运行总计超过 15 时重置为零?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn