通用语法计算月累计以及年累计

搜索了很多的百度资料一直都是单独的语中的适配,大部分是使用了函数语法来实现的月累计或者年累计但是现有如下需求,

需求:每个月的数据对应的值(QUANTITY数量)做月累计和年累计汇总且不能只支持一种sql语法,所以需要写通用的sql来计算年累计和月累计,如下所示

1、计算月累计

truncate table TMP_NRESA_BUDGET_TO_REPORT_SUM;
INSERT INTO
  TMP_NRESA_BUDGET_TO_REPORT_SUM(
    YEAR_QUANTITY,
    QUANTITY,
    BEGIN_QUANTITY,
    END_QUANTITY,
    DEF_PERIOD,
    BUDGETTYPE,
    PK_PCORG,
    PK_ORG,
    PERIOD,
    SYEAR,
    PK_GROUP,
    REPORT_ITEM_CODE,
    CASHREPORT_ITEM_CODE,
    PK_LIABILITYBOOK,
    SCOUNT,
    PK_REPORT_ITEM
  )
SELECT
  SUM(
    CASE
      WHEN opm.PERIOD_MONTH >= onab.PERIOD THEN QUANTITY
      ELSE 0
    END
  ) AS year_quantity,
  SUM(
    CASE
      WHEN opm.PERIOD_MONTH = onab.PERIOD THEN QUANTITY
      ELSE 0
    END
  ) AS quantity,
  SUM(
    CASE
      WHEN opm.PERIOD_MONTH = onab.PERIOD THEN BEGIN_QUANTITY
      ELSE 0
    END
  ) AS BEGIN_QUANTITY,
  SUM(
    CASE
      WHEN opm.PERIOD_MONTH = onab.PERIOD THEN END_QUANTITY
      ELSE 0
    END
  ) AS end_quantity,
    concat(concat(opm.PERIOD_YEAR,'-'),opm.PERIOD_MONTH) def_period,
  onab.BUDGETTYPE,
  onab.PK_PCORG,
  onab.PK_ORG,
  opm.PERIOD_MONTH as period,
  opm.PERIOD_YEAR as syear,
  onab.PK_GROUP,
  onab.REPORT_ITEM_CODE,
  onab.CASHREPORT_ITEM_CODE,
  onab.PK_LIABILITYBOOK,
  sum(onab.SCOUNT) SCOUNT,
  onab.PK_REPORT_ITEM
FROM
  ODIM_PERIOD_MONTH opm,
  TMP_NRESA_BUDGET_REPORT_SUM onab
where
  opm.PK_PERIODSCHEME = onab.PK_PERIOD
  and opm.PERIOD_YEAR = onab.SYEAR
group by
  opm.PERIOD_YEAR,
  opm.PERIOD_MONTH,
  onab.DEF_PERIOD,
  onab.BUDGETTYPE,
  onab.PK_PCORG,
  onab.PK_ORG,
  onab.PK_GROUP,
  onab.REPORT_ITEM_CODE,
  onab.CASHREPORT_ITEM_CODE,
  onab.PK_LIABILITYBOOK,
  onab.PK_REPORT_ITEM
ORDER BY
  opm.PERIOD_YEAR,
  opm.PERIOD_MONTH;

ODIM_PERIOD_MONTH 该表为我们的月份表,其中有一个期间PK_PERIODSCHEME 和PK_PERIOD字段做关联,这样我们可以查询出(比如我们目前在TMP_NRESA_BUDGET_REPORT_SUM该表中只有1月的值和3月的值,实际我们需要1-12月每个月份的累计值)本来没有的期间,补全每个期间累计的值

2、计算年累计

需求:将当年的值累加到最后一个月 ,其实使用上面的就可以实现当前的效果了,直接取当年最大期间的值即可不用在单独做年累计计算。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值