计算每个月的前六个月内的累计值

业务需求:计算每个月的前六个月内的累计值

增量:比较好求,就是求统计日期在当月之前六个月至当月值的累计
但是对于全量来说,就不好求了,因为大概一思考,这里涉及到循环,也就是说,每个月都需要找前六个月内的累计值.


下面提供一种方法来计算全量累计值.


思路:
1.建立一个日历表
2.建立一个事实表
3.以日历表为主表,通过时间进行不等值连接,统计六个月内的累计值.


--1.日历表 2014年整年
CREATE TABLE tmp_lxq_2 AS
SELECT  DATE'2014-01-01' AS statis_dt FROM dual;
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-02-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-03-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-04-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-05-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-06-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-07-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-08-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-09-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-10-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-11-01';
INSERT INTO TMP_LXQ_2
  SELECT DATE '2014-12-01';
COMMIT;


SELECT * FROM TMP_LXQ_2;

--结果:




--事实表 日期+数量
DROP TABLE tmp_lxq_1;
CREATE TABLE tmp_lxq_1 AS
(SELECT DATE'2014-01-01' AS statis_dt,'100' AS qty ) WITH DATA;

INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-02-01' AS STATIS_DT, '200' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-03-01' AS STATIS_DT, '300' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-04-01' AS STATIS_DT, '400' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-05-01' AS STATIS_DT, '500' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-06-01' AS STATIS_DT, '600' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-07-01' AS STATIS_DT, '700' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-08-01' AS STATIS_DT, '800' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-09-01' AS STATIS_DT, '900' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-10-01' AS STATIS_DT, '1000' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-11-01' AS STATIS_DT, '100' AS QTY;
INSERT INTO TMP_LXQ_1
  SELECT DATE '2014-12-01' AS STATIS_DT, '100' AS QTY;

SELECT * FROM TMP_LXQ_1;

--结果:




--计算某个月内的前六个月的值分别是什么(此处计算8月份)
SELECT A.*, B.*
  FROM TMP_LXQ_1 A
 INNER JOIN (SELECT T.STATIS_DT AS CALENDAR_DATE
               FROM TMP_LXQ_2 T
              WHERE T.STATIS_DT >= DATE '2014-08-01'
                AND T.STATIS_DT < DATE '2014-09-01') B
    ON A.STATIS_DT >= CAST(ADD_MONTHS(CAST(B.CALENDAR_DATE AS DATE FORMAT 'YYYYMM'), -6) AS DATE FORMAT 'YYYYMMDD')
   AND A.STATIS_DT <= CAST(CAST(CAST(B.CALENDAR_DATE AS DATE FORMAT 'yyyymm') AS VARCHAR(6)) || '01' AS DATE FORMAT 'yyyymmdd')


结果:




--在第三步的基础上进行分组求累计值
SELECT B.CALENDAR_DATE, SUM(A.QTY)
  FROM TMP_LXQ_1 A
 INNER JOIN (SELECT T.STATIS_DT AS CALENDAR_DATE
               FROM TMP_LXQ_2 T
              WHERE T.STATIS_DT >= DATE '2014-01-01'
                AND T.STATIS_DT < DATE '2014-12-01') B
    ON A.STATIS_DT >= CAST(ADD_MONTHS(CAST(B.CALENDAR_DATE AS DATE FORMAT 'YYYYMM'), -6) AS DATE FORMAT 'YYYYMMDD')
   AND A.STATIS_DT <= CAST(CAST(CAST(B.CALENDAR_DATE AS DATE FORMAT 'yyyymm') AS VARCHAR(6)) || '01' AS DATE FORMAT 'yyyymmdd')
 GROUP BY B.CALENDAR_DATE

结果:


至此,结果就正确表达出来了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值