PL/SQL 查询统计企业税额累计额(包含缺失月份数据)
以下是一个可能的解决方案,使用 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;
解释一下:
-
子查询
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 月的数字。 -
INNER JOIN 把 nsxx 表和上面生成的数字表连接起来,条件是这条记录的
date_begin在 2022 年,并且它所在的月份小于等于当前的月份,同时这条记录的date_end要么为空,要么在当前月份之后(这样才能确保用的是离date_end最近的记录)。 -
SELECT 子句中的
TO_CHAR(TO_DATE('2022-' || LPAD(MONTH_NUM, 2, '0'), 'YYYY-MM'), 'YYYY年MM月')把数字月份转成形如 '2022年01月' 的字符串格式。 -
最后使用 GROUP BY 和 SUM 按月份统计每个月的总税额。
原文地址: https://www.cveoy.top/t/topic/l0nL 著作权归作者所有。请勿转载和采集!