YTD解答方案
要求:输出字段: 年月, YTD金额
因为我这边只有system一个账号,就用system账号写
合同表的结构和数据如下:
create column table "SYSTEM"."CONTRACTS"
("CONTRACT_ID" INTEGER null, --合同ID
"START_DATE" DATE null, --开始日期
"END_DATE" DATE null, --结束日期
"AMOUNT" DECIMAL (18,2) null) --每月金额
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计算就可以了