搜索了很多的百度资料一直都是单独的语中的适配,大部分是使用了函数语法来实现的月累计或者年累计但是现有如下需求,
需求:每个月的数据对应的值(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、计算年累计
需求:将当年的值累加到最后一个月 ,其实使用上面的就可以实现当前的效果了,直接取当年最大期间的值即可不用在单独做年累计计算。