YTD解答方案sql
要求:输出字段: 年月, YTD金额函数
由于我这边只有system一个帐号,就用system帐号写spa
合同表的结构和数据以下:设计
create column table "SYSTEM"."CONTRACTS"3d
("CONTRACT_ID" INTEGER null, --合同IDblog
"START_DATE" DATE null, --开始日期io
"END_DATE" DATE null, --结束日期table
"AMOUNT" DECIMAL (18,2) null) --每个月金额date
insert into " SYSTEM "."CONTRACTS" VALUES(1,'2012-04-01', '2013-06-30',100);方法
insert into " SYSTEM "."CONTRACTS" VALUES(2,'2013-07-01', '2015-03-31',100);
insert into " SYSTEM "."CONTRACTS" VALUES(3,'2014-02-01', '2015-07-31',100);
insert into " SYSTEM "."CONTRACTS" VALUES(4,'2014-05-01', '2016-10-31',100);
insert into " SYSTEM "."CONTRACTS" VALUES(5,'2014-07-01', '2015-05-31',100);
insert into " SYSTEM "."CONTRACTS" VALUES(6,'2015-01-01', '2016-02-29',100);
insert into " SYSTEM "."CONTRACTS" VALUES(7,'2015-08-01', '2016-09-30',100);
insert into " SYSTEM "."CONTRACTS" VALUES(8,'2014-02-01', '2014-12-31',100);
insert into " SYSTEM "."CONTRACTS" VALUES(9,'2015-02-01', '2015-03-30',100);
日期表结构, 自行设计. 日期表要具备通用性, 不容许包含任何合同信息.
要求:创建一个带参数计算视图, 分别用SQL语句和图形的方式创建.
创建一个存储过程,每月计算YTD,如何计划执行该存储过程。
输入时间参数201406-201506 求YTD
从题目的要求中不难看出有如下几个要求:
1. 弄清楚YTD概念(YTD是year to date的缩写)意思是:到如今为止的一年,最近的一年
2.日期表须要自行设计
3.创建计算视图 图形和sql语句两种
4.还须要写一个procedure
5.还须要设置一个过滤器来筛选时间
过程:
首先,我对合同表的时间进行分析 能够联想时间格式设置为YYYYMM 因此我对时间表的设计便可以设置Year、Month 和YM 可是咱们可能后续还须要对其进行计算 因此在放入两个int型的数据Year_int and Month_int。在日期表中多加入一个伪列JOIN做为join列 在后续的方法中链接。设计完毕后,添加数据。
首先争对合同表与日期表进行建立与加入数据(下图为表位置与表结构)
接下来建立合同表的计算视图,为了将日期格式都设置为YYYYMM格式 因此咱们能够用一些函数记性设计
我要为合同表添加一下几个字段来方便计算运用,起始时间START_TIME(varchar类型,格式为‘yyyyMM’)、结束时间END_TIME(varchar类型,格式为‘yyyyMM’)、与日期表JOIN字段列(integer类型,格式为‘1’)、开始年、开始月、结束年、结束月(统为integer类型)
以下图:
最后就是进行YTD的计算了,由于在分析模型中 咱们对合同表也插入了一行伪列 JOIN因此咱们能够用join将其链接起来,
而后在里面join_1添加flag字段目的是去掉合同表日期与日期表日期不相关的数据(只有月份大于等于start而且小于等于end才能够经过)。
过滤后 就要进行YTD计算, 在projection_3里面写了一个YTD计算(YEARMONTH小于等于END_TIME的时候 跳转到 另外一个if中 若是YEAR_INT=START_YEAR_INT 则表明同年 直接MONTH_INT-START_MONTH_INT便可 若是不是则表明不一样年 因此用MONTH_INT便可)
最后在Semantics中设置维度和度量 以及对YEARMONTH添加过滤器
这样图形建立计算视图就解决了
接下来sql语句建立计算视图,首先须要添加如下几个计算列,START_TIME 、END_TIME、YAERMONTHS ,计算方法按照YTD计算就能够了