可以使用子查询和聚合函数来实现:

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;

解释:

  1. 外层SELECT语句使用TO_CHAR函数将月份转换为yyyy-mm格式,并使用聚合函数SUM计算每个月的tax_amount的加总额。

  2. 内层SELECT语句使用LEFT JOIN自连接,找到每个月离它最近的一个月(即比它小但最接近它的月份),并将它的month作为last_month列返回。

  3. 如果last_month为空,则说明该月没有前一个月的数据,需要取得最近的一个月的数据;如果last_month不为空,则说明该月有前一个月的数据,不需要取得最近的一个月的数据。

  4. WHERE子句中的条件用于过滤出需要统计的月份。

  5. GROUP BY子句中使用TO_CHAR函数将月份转换为yyyy-mm格式,以便按照月份进行聚合。

  6. ORDER BY子句中按照月份进行排序。

在plsql中表nsxx里面有字段month、tax_amount、corp其中tax_amount为month的税额累计额corp为企业;但month不是每个月都有如没有应取离它最近一个月的数据请问如何用sql查询语句统计2022年1月至12月每个月的tax_amount的加总额

原文地址: https://www.cveoy.top/t/topic/IL0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录