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

SELECT TO_CHAR(to_date('2022-'||m||'-01','yyyy-mm-dd'),'yyyy-mm') AS month,
       SUM(tax_amount) AS total_tax_amount
FROM (
  SELECT ns1.month, ns1.tax_amount, ns1.corp,
         MAX(ns2.month) KEEP (DENSE_RANK LAST ORDER BY ns2.month) AS last_month
  FROM nsxx ns1
  LEFT JOIN nsxx ns2 ON ns1.corp = ns2.corp AND ns1.month > ns2.month
  WHERE ns1.month BETWEEN '2022-01' AND '2022-12'
  GROUP BY ns1.month, ns1.tax_amount, ns1.corp
)
WHERE last_month IS NULL OR month = last_month
GROUP BY TO_CHAR(to_date('2022-'||m||'-01','yyyy-mm-dd'),'yyyy-mm')
ORDER BY month;

解释:

  1. 外层 SELECT 语句使用 TO_CHAR 函数将月份转换为 yyyy-mm 格式,并使用聚合函数 SUM 计算每个月的 tax_amount 的加总额。

  2. 内层 SELECT 语句使用 LEFT JOIN 自连接,找到每个月离它最近的一个月(即比它小但最接近它的月份),并将它的 month 作为 last_month 列返回。

  3. 如果 last_month 为空,则说明该月没有前一个月的数据,需要取得最近的一个月的数据;如果 last_month 不为空,则说明该月有前一个月的数据,不需要取得最近的一个月的数据。

  4. WHERE 子句中的条件用于过滤出需要统计的月份。

  5. GROUP BY 子句中使用 TO_CHAR 函数将月份转换为 yyyy-mm 格式,以便按照月份进行聚合。

  6. ORDER BY 子句中按照月份进行排序。

PL/SQL 查询:如何统计2022年每个月的税额累计总额 (含缺失月份数据)

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

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