可以使用子查询和聚合函数来实现:

SELECT TO_CHAR(add_months(to_date('202201', 'yyyymm'), level-1), 'yyyy-mm') AS month,
       SUM(tax_amount) AS total_tax_amount
FROM (
    SELECT corp, tax_amount, 
           MAX(month) KEEP (DENSE_RANK LAST ORDER BY month) OVER (PARTITION BY corp ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS max_month
    FROM nsxx
    WHERE month BETWEEN '202201' AND '202212'
)
CONNECT BY LEVEL <= MONTHS_BETWEEN(to_date('202212', 'yyyymm'), to_date('202201', 'yyyymm'))+1
AND PRIOR month = ADD_MONTHS(to_date('202201', 'yyyymm'), LEVEL-2)
AND PRIOR corp = corp
AND PRIOR dbms_random.value IS NOT NULL
GROUP BY TO_CHAR(add_months(to_date('202201', 'yyyymm'), level-1), 'yyyy-mm')
ORDER BY month;

解释一下查询语句:

  1. 子查询中,先筛选出所需时间范围内的数据,并利用MAX函数和KEEP子句获取每个企业最近的月份数据。

  2. 外层查询中,使用CONNECT BY LEVEL来获取2022年1月至12月的月份,并利用PRIOR关键字实现递归查询。

  3. 最后使用聚合函数SUM计算每个月的tax_amount总和,并按月份排序输出。

需要注意的是,该查询语句可能在数据量较大的情况下效率较低,可以根据实际情况进行优化。

PLSQL 统计表中税额累计总额 - 处理缺失月份数据

原文地址: https://www.cveoy.top/t/topic/lZOg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录