HANA 存储过程 YTD

YTD

现有合同表一份, 要求计算任意指定范围内的每个月的YTD (全部同时列出). 输出字段: 年月, YTD金额。

合同表数据:

insert into "HANABI"."CONTRACTS" VALUES(1,'2012-04-01', '2013-06-30',100);
insert into "HANABI"."CONTRACTS" VALUES(2,'2013-07-01', '2015-03-31',100);
insert into "HANABI"."CONTRACTS" VALUES(3,'2014-02-01', '2015-07-31',100);
insert into "HANABI"."CONTRACTS" VALUES(4,'2014-05-01', '2016-10-31',100); 
insert into "HANABI"."CONTRACTS" VALUES(5,'2014-07-01', '2015-05-31',100);
insert into "HANABI"."CONTRACTS" VALUES(6,'2015-01-01', '2016-02-29',100);
insert into "HANABI"."CONTRACTS" VALUES(7,'2015-08-01', '2016-09-30',100);
insert into "HANABI"."CONTRACTS" VALUES(8,'2014-02-01', '2014-12-31',100);
insert into "HANABI"."CONTRACTS" VALUES(9,'2015-02-01', '2015-03-30',100);

一.建模

1.1建表创建日期表、合同表。

合同表:
HANA 存储过程 YTD_第1张图片
年月表:
HANA 存储过程 YTD_第2张图片
通过EXCEL的CSV格式向年月表导入数据:
HANA 存储过程 YTD_第3张图片

1.2创建视图

创建年月属性试图:
HANA 存储过程 YTD_第4张图片
创建YEARM计算列调整年月格式:
HANA 存储过程 YTD_第5张图片
创建合同分析视图:
HANA 存储过程 YTD_第6张图片
创建join时的计算列CONT:
HANA 存储过程 YTD_第7张图片
创建计算列STARTI设置合同开始时间YYYYMM格式:
HANA 存储过程 YTD_第8张图片

创建计算列ENDTI设置合同结束时间YYYYMM格式:
HANA 存储过程 YTD_第9张图片

创建计算列STAR_YEAR_INT提取合同开始年:
HANA 存储过程 YTD_第10张图片

创建计算列END_YEAR_INT提取合同结束年:
HANA 存储过程 YTD_第11张图片

创建计算列STR_MON_INT提取合同开始月:
HANA 存储过程 YTD_第12张图片

创建计算列STR_MON_INT提取合同结束月:
HANA 存储过程 YTD_第13张图片

创建计算视图关联合同分析视图和年月属性视图
创建计算列YM调整年月格式为YYYYMM
HANA 存储过程 YTD_第14张图片

通过CONT字段将合同分析视图和年月属性视图关联
HANA 存储过程 YTD_第15张图片

创建GL计算列通过输入参数对年月进行过滤:
HANA 存储过程 YTD_第16张图片
创建计算列YTD
HANA 存储过程 YTD_第17张图片

创建时间过滤
HANA 存储过程 YTD_第18张图片

1.3结果展示

输入年月范围201406-201506.
HANA 存储过程 YTD_第19张图片
HANA 存储过程 YTD_第20张图片

二.创建脚本计算试图

HANA 存储过程 YTD_第21张图片

创建YM,YTD输出列:
HANA 存储过程 YTD_第22张图片

SQL语句展示:

 /********* Begin Procedure Script ************/ 
 BEGIN 
       var_out =
 SELECT
 YM,
 SUM( 
       CASE 
       WHEN YM > ENDTI AND
TO_INT(LEFT(STARTI,4)) = TO_INT(LEFT(ENDTI,4))
       THEN (TO_INT(RIGHT(ENDTI,2)) - TO_INT(RIGHT(STARTI,2))+ 1) * AMOUNT
       WHEN YM > ENDTI AND
TO_INT(LEFT(STARTI,4)) < TO_INT(LEFT(ENDTI,4))
       THEN TO_INT(RIGHT(ENDTI,2)) * AMOUNT
       WHEN YM <= ENDTI AND
YEAR_INT = TO_INT(LEFT(STARTI,4))
       THEN (MONTH_INT - TO_INT(RIGHT(STARTI,2))+ 1)*AMOUNT
       ELSE MONTH_INT * AMOUNT
       END
       ) AS YTD
FROM 
  (SELECT YEAR_INT,
                          MONTH_INT,
                          TO_CHAR(CONCAT (LEFT(CONCAT(YEAR_INT,CONCAT('0',MONTH_INT)),4),RIGHT(CONCAT(YEAR_INT,CONCAT('0',MONTH_INT)),2)))
AS YM 
  FROM "HA_NC"."DATE_YDT") ,
  (SELECT START_DATE,END_DATE,AMOUNT,
                     CONCAT(LEFT(START_DATE,4),RIGHT(LEFT(START_DATE,7),2))
STARTI ,
                     CONCAT(LEFT(END_DATE,4),RIGHT(LEFT(END_DATE,7),2))
ENDTI 
  FROM "HA_NC"."CONTRACTS")     
  WHERE YM >= STARTI AND
YEAR_INT <= TO_INT(LEFT(ENDTI,4))
GROUP BY YM;
END /*********End Procedure Script ************/

结果展示:
HANA 存储过程 YTD_第23张图片

三。存储过程

创建存储过程:
HANA 存储过程 YTD_第24张图片
HANA 存储过程 YTD_第25张图片
创建Stored Procedure文件:
HANA 存储过程 YTD_第26张图片

代码如下:

PROCEDURE "HA_NC"."NC::PRACTICE" (IN  STARTT VARCHAR(6),IN ENDTT VARCHAR(6) ) 
       LANGUAGE SQLSCRIPT
       SQL SECURITY INVOKER 
       --DEFAULT
SCHEMA 
       --READS
SQL DATA 
       AS
BEGIN
 DELETE FROM "HA_NC"."BBB";
INSERT INTO "HA_NC"."BBB"
 SELECT
 YM,
 SUM( 
       CASE 
       WHEN YM > ENDTI AND TO_INT(LEFT(STARTI,4)) = TO_INT(LEFT(ENDTI,4))
       THEN (TO_INT(RIGHT(ENDTI,2)) - TO_INT(RIGHT(STARTI,2)) + 1) * AMOUNT
       WHEN YM > ENDTI AND TO_INT(LEFT(STARTI,4)) < TO_INT(LEFT(ENDTI,4))
       THEN TO_INT(RIGHT(ENDTI,2)) * AMOUNT
       WHEN YM <= ENDTI AND YEAR_INT = TO_INT(LEFT(STARTI,4))
       THEN (MONTH_INT - TO_INT(RIGHT(STARTI,2)) + 1)*AMOUNT
       ELSE MONTH_INT * AMOUNT
       END
       ) AS YTD
FROM 
  (SELECT YEAR_INT,
                          MONTH_INT,
                          TO_CHAR(CONCAT (LEFT(CONCAT(YEAR_INT,CONCAT('0',MONTH_INT)),4),RIGHT(CONCAT(YEAR_INT,CONCAT('0',MONTH_INT)),2))) AS YM 
  FROM "HA_NC"."DATE_YDT") ,
  (SELECT START_DATE,END_DATE,AMOUNT,
                     CONCAT(LEFT(START_DATE,4),RIGHT(LEFT(START_DATE,7),2))
STARTI ,
                     CONCAT(LEFT(END_DATE,4),RIGHT(LEFT(END_DATE,7),2))
ENDTI 
  FROM "HA_NC"."CONTRACTS")     
  WHERE YM >= STARTI AND YEAR_INT <= TO_INT(LEFT(ENDTI,4)) AND YM >=STARTT AND YM <=ENDTT
GROUP BY YM;
END;

创建存储数据的表:

HANA 存储过程 YTD_第27张图片

调用存储过程

通过CALL来调用,如图:
HANA 存储过程 YTD_第28张图片

结果展示

查询表BBB数据显示:
HANA 存储过程 YTD_第29张图片

你可能感兴趣的:(HANA)