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計算就能夠了