PLSQL 查询统计税额累计:处理缺失月份数据
可以使用以下 SQL 语句来查询统计 2022 年 1 月至 2023 年 1 月每个月的 tax_amount 的加总额:
SELECT TO_CHAR(add_months(to_date('2022-01-01','yyyy-mm-dd'),level-1),'yyyy-mm') AS month,
SUM(tax_amount) AS total_tax_amount
FROM nsxx
WHERE TO_CHAR(month,'yyyy-mm-dd') >= '2022-01' AND TO_CHAR(month,'yyyy-mm-dd') <= '2023-01'
GROUP BY TO_CHAR(add_months(to_date('2022-01-01','yyyy-mm-dd'),level-1),'yyyy-mm')
ORDER BY month;
解释:
- 使用
add_months函数和level-1来生成 2022 年 1 月至 2023 年 1 月的月份序列。 - 使用
TO_CHAR函数将月份转换为 yyyy-mm 格式。 - 使用
WHERE子句过滤出 2022 年 1 月至 2023 年 1 月的数据。 - 使用
GROUP BY子句和SUM函数对每个月的 tax_amount 求和。 - 使用
ORDER BY子句按月份排序输出结果。
处理缺失月份数据
如果 nsxx 表中某些月份没有数据,可以使用以下方法进行处理:
- 使用
LEFT JOIN连接一个包含所有月份的虚拟表
WITH months AS (
SELECT TO_CHAR(add_months(to_date('2022-01-01','yyyy-mm-dd'),level-1),'yyyy-mm') AS month
FROM dual
CONNECT BY level <= 13
)
SELECT m.month, COALESCE(SUM(n.tax_amount), 0) AS total_tax_amount
FROM months m
LEFT JOIN nsxx n ON m.month = TO_CHAR(n.month, 'yyyy-mm')
WHERE TO_CHAR(m.month, 'yyyy-mm') >= '2022-01' AND TO_CHAR(m.month, 'yyyy-mm') <= '2023-01'
GROUP BY m.month
ORDER BY m.month;
- 使用
LAG函数向前查找最近的月份数据
SELECT TO_CHAR(month, 'yyyy-mm') AS month,
COALESCE(tax_amount, LAG(tax_amount, 1, 0) OVER (ORDER BY month)) AS total_tax_amount
FROM nsxx
WHERE TO_CHAR(month, 'yyyy-mm') >= '2022-01' AND TO_CHAR(month, 'yyyy-mm') <= '2023-01'
ORDER BY month;
以上两种方法都可以确保每个月都有数据统计,即使表中某些月份没有数据。请根据您的具体情况选择最合适的方案。
原文地址: https://www.cveoy.top/t/topic/lZwx 著作权归作者所有。请勿转载和采集!