我有以下数据集,其中我想检查某个零件是否有过去 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;
您可以使用窗口函数,对每个部分进行过去 3 个月的滚动总和。
数据为( -- 您的数据放在这里 )
选择部分、月份、 SUM(qty) OVER(按部分分区 ORDER BY 月份 前 '3' 个月间隔与当前行之间的范围)AS Total_qty
来自数据
按零件、月份排序;