Oracle SQL:如何获取最近 3 个月的滚动 SUM?

问题描述 投票:0回答:1

我有以下数据集,其中我想检查某个零件是否有过去 3 个月的数量并将其求和。例如,对于

ABC
部分,对于
01-MAY-23
月份,vdate 列中的最后 3 个月是
01-MAY-23, 01-APR-23, 01-MAR-23
。由于存在这 3 个月,我想将数量添加为
50 + 40 + 30 = 120
DEF
部分不存在同样的情况,因此该部分不会出现在输出中。

data

| PART | VDATE     | MONTH     | QTY |
|------|-----------|-----------|-----|
| ABC  | 01-JAN-23 | 01-MAY-23 | 10  |
| ABC  | 01-FEB-23 | 01-MAY-23 | 20  |
| ABC  | 01-MAR-23 | 01-MAY-23 | 30  |
| ABC  | 01-APR-23 | 01-MAY-23 | 40  |
| ABC  | 01-MAY-23 | 01-MAY-23 | 50  |
| ABC  | 01-MAR-23 | 01-JUN-23 | 25  |
| ABC  | 01-APR-23 | 01-JUN-23 | 35  |
| ABC  | 01-MAY-23 | 01-JUN-23 | 45  |
| ABC  | 01-JUN-23 | 01-JUN-23 | 55  |
| DEF  | 01-APR-23 | 01-MAY-23 | 25  |
| DEF  | 01-MAY-23 | 01-MAY-23 | 35  |

Output

| PART | MONTH     | QTY |
|------|-----------|-----|
| ABC  | 01-MAY-23 | 120 |
| ABC  | 01-JUN-23 | 135 |

sql

WITH data AS (
    SELECT 'ABC' part, TO_DATE('01-JAN-23') vdate, TO_DATE('01-MAY-23') month, 10 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-FEB-23') vdate, TO_DATE('01-MAY-23') month, 20 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-MAR-23') vdate, TO_DATE('01-MAY-23') month, 30 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-APR-23') vdate, TO_DATE('01-MAY-23') month, 40 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-MAY-23') vdate, TO_DATE('01-MAY-23') month, 50 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-MAR-23') vdate, TO_DATE('01-JUN-23') month, 25 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-APR-23') vdate, TO_DATE('01-JUN-23') month, 35 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-MAY-23') vdate, TO_DATE('01-JUN-23') month, 45 qty FROM dual UNION
    SELECT 'ABC' part, TO_DATE('01-JUN-23') vdate, TO_DATE('01-JUN-23') month, 55 qty FROM dual UNION
    SELECT 'DEF' part, TO_DATE('01-APR-23') vdate, TO_DATE('01-MAY-23') month, 25 qty FROM dual UNION
    SELECT 'DEF' part, TO_DATE('01-MAY-23') vdate, TO_DATE('01-MAY-23') month, 35 qty FROM dual
)

SELECT *
FROM data;
sql oracle window-functions
1个回答
0
投票

您可以使用窗口函数,对每个部分进行过去 3 个月的滚动总和。

数据为( -- 您的数据放在这里 )

选择部分、月份、 SUM(qty) OVER(按部分分区 ORDER BY 月份 前 '3' 个月间隔与当前行之间的范围)AS Total_qty

来自数据

按零件、月份排序;

© www.soinside.com 2019 - 2024. All rights reserved.