在plsql中表nsxx里面有字段month、tax_amount、corp其中tax_amount为month的税额累计额corp为企业;但month不是每个月都有如没有应取离它最近一个月的数据请问如何用sql查询语句统计2022年1月至12月每个月的tax_amount的加总额
可以使用子查询和聚合函数来实现:
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/IL0 著作权归作者所有。请勿转载和采集!