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建表创建日期表、合同表。

合同表:
合同表
年月表:
年月表
通过EXCEL的CSV格式向年月表导入数据:

1.2创建视图

创建年月属性试图:

创建YEARM计算列调整年月格式:

创建合同分析视图:

创建join时的计算列CONT:

创建计算列STARTI设置合同开始时间YYYYMM格式:

创建计算列ENDTI设置合同结束时间YYYYMM格式:

创建计算列STAR_YEAR_INT提取合同开始年:

创建计算列END_YEAR_INT提取合同结束年:

创建计算列STR_MON_INT提取合同开始月:

创建计算列STR_MON_INT提取合同结束月:

创建计算视图关联合同分析视图和年月属性视图
创建计算列YM调整年月格式为YYYYMM

通过CONT字段将合同分析视图和年月属性视图关联

创建GL计算列通过输入参数对年月进行过滤:

创建计算列YTD

创建时间过滤

1.3结果展示

输入年月范围201406-201506.

二.创建脚本计算试图

创建YM,YTD输出列:

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 ************/

结果展示:

三。存储过程

创建存储过程:


创建Stored Procedure文件:

代码如下:

PROCEDURE "HA_NC"."NC::PRACTICE" (IN  STARTT VARCHAR(6),IN ENDTT VARCHAR(6) ) 
       LANGUAGE SQLSCRIPT
       SQL SECURITY INVOKER 
       --DEFAULT
SCHEMA <default_schema_name>
       --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;

创建存储数据的表:

调用存储过程

通过CALL来调用,如图:

结果展示

查询表BBB数据显示:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joan nan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值