在plsql中表nsxx里面有字段month、tax_amount、corp其中tax_amount为month的税额累计额corp为企业;但month不是每个月都有如没有应取离它最近一个月的数据请问如何用sql查询语句统计2022年1月至2022年12月每个月的tax_amount的加总额
可以使用子查询和聚合函数来实现:
SELECT TO_CHAR(dates.month, 'YYYY-MM') AS month,
SUM(tax_amount) AS total_tax_amount
FROM (
SELECT TO_DATE('2022-01-01', 'YYYY-MM-DD') + LEVEL - 1 AS month
FROM DUAL
CONNECT BY LEVEL <= 12
) dates
LEFT JOIN nsxx ON nsxx.month = (
SELECT MAX(month)
FROM nsxx
WHERE month <= dates.month
)
GROUP BY TO_CHAR(dates.month, 'YYYY-MM')
ORDER BY TO_CHAR(dates.month, 'YYYY-MM')
解释一下查询语句的各个部分:
- 子查询:生成2022年1月至12月的日期序列。
SELECT TO_DATE('2022-01-01', 'YYYY-MM-DD') + LEVEL - 1 AS month
FROM DUAL
CONNECT BY LEVEL <= 12
这里使用了CONNECT BY LEVEL语句来生成1到12的序列,然后加上起始日期'2022-01-01',得到日期序列。
- LEFT JOIN:将日期序列与nsxx表左连接,找到离每个月最近的数据。
LEFT JOIN nsxx ON nsxx.month = (
SELECT MAX(month)
FROM nsxx
WHERE month <= dates.month
)
这里使用子查询找到nsxx表中离每个月最近的数据,然后与日期序列进行左连接,保证每个月都有一条记录。
- 聚合函数:计算每个月的税额累计额。
SELECT TO_CHAR(dates.month, 'YYYY-MM') AS month,
SUM(tax_amount) AS total_tax_amount
FROM ...
GROUP BY TO_CHAR(dates.month, 'YYYY-MM')
最后使用TO_CHAR函数将日期转换成YYYY-MM格式,然后使用SUM函数计算每个月的tax_amount的加总额。
原文地址: https://www.cveoy.top/t/topic/IJL 著作权归作者所有。请勿转载和采集!