以下是一个可能的解决方案,使用 INNER JOIN 和子查询:

SELECT
  TO_CHAR(TO_DATE('2022-' || LPAD(MONTH_NUM, 2, '0'), 'YYYY-MM'), 'YYYY年MM月') AS MONTH,
  SUM(nsxx.tax_amount) AS TOTAL_TAX_AMOUNT
FROM
  (
    SELECT 1 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 2 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 3 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 4 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 5 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 6 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 7 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 8 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 9 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 10 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 11 AS MONTH_NUM FROM DUAL UNION ALL
    SELECT 12 AS MONTH_NUM FROM DUAL
  ) months
  INNER JOIN nsxx ON
    EXTRACT(YEAR FROM nsxx.date_begin) = 2022 AND
    EXTRACT(MONTH FROM nsxx.date_begin) <= months.MONTH_NUM AND
    (nsxx.date_end IS NULL OR EXTRACT(MONTH FROM nsxx.date_end) >= months.MONTH_NUM) -- use the latest data of the month if date_end is NULL
GROUP BY months.MONTH_NUM
ORDER BY months.MONTH_NUM;

解释一下:

  1. 子查询 SELECT 1 AS MONTH_NUM FROM DUAL UNION ALL SELECT 2 AS MONTH_NUM FROM DUAL UNION ALL ... SELECT 12 AS MONTH_NUM FROM DUAL 用于生成 1 到 12 月的数字。

  2. INNER JOIN 把 nsxx 表和上面生成的数字表连接起来,条件是这条记录的 date_begin 在 2022 年,并且它所在的月份小于等于当前的月份,同时这条记录的 date_end 要么为空,要么在当前月份之后(这样才能确保用的是离 date_end 最近的记录)。

  3. SELECT 子句中的 TO_CHAR(TO_DATE('2022-' || LPAD(MONTH_NUM, 2, '0'), 'YYYY-MM'), 'YYYY年MM月') 把数字月份转成形如 '2022年01月' 的字符串格式。

  4. 最后使用 GROUP BY 和 SUM 按月份统计每个月的总税额。

PL/SQL 查询统计企业税额累计额(包含缺失月份数据)

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

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