PL/SQL 查询:如何统计2022年每个月的税额累计总额 (含缺失月份数据)
可以使用子查询和聚合函数来实现:
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;
解释:
-
外层 SELECT 语句使用 TO_CHAR 函数将月份转换为 yyyy-mm 格式,并使用聚合函数 SUM 计算每个月的 tax_amount 的加总额。
-
内层 SELECT 语句使用 LEFT JOIN 自连接,找到每个月离它最近的一个月(即比它小但最接近它的月份),并将它的 month 作为 last_month 列返回。
-
如果 last_month 为空,则说明该月没有前一个月的数据,需要取得最近的一个月的数据;如果 last_month 不为空,则说明该月有前一个月的数据,不需要取得最近的一个月的数据。
-
WHERE 子句中的条件用于过滤出需要统计的月份。
-
GROUP BY 子句中使用 TO_CHAR 函数将月份转换为 yyyy-mm 格式,以便按照月份进行聚合。
-
ORDER BY 子句中按照月份进行排序。
原文地址: https://www.cveoy.top/t/topic/lZH2 著作权归作者所有。请勿转载和采集!