HANA SQL用户变量还是循环或窗口函数?

2020-09-08 18:07发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

我有一个具有以下值的表:

日期值
 6/3/2019 -50
 6/25/2019 20
 7/28/2019 -41
 8/6/2019 -41
 8/18/2019 -27
 2019年10月18日90
 2019年10月19日90
 11/2/2019 -16
 11/2/2019 61
 11/20/2019 -30
 2019年11月28日95
 12/30/2019 -18
 2020年1月1日76
 2020年2月1日14
 2020年2月9日36
 2020年2月21日48
 3/4/2020 -38
 2020年4月18日41
 5/14/2020 46
 2020年5月26日62
 5/27/2020 -22
 6/8/2020 61
 2020年8月30日77
 2020年10月7日59
 2020年11月15日51
 2020年12月19日18
 2021年1月12日26
 1/24/2021 82
 2/18/2021 10
 20/11/3 -37
 4/5/2021 -17
 6/16/2021 85
 

我想在此表上执行SELECT,并在"值"字段上进行计算。 如果您将上述数据剪切粘贴到Excel中,则第三列的公式为:

= IF(OR(AND(AND(B2> 0,C1 <0),AND(B2 <0,C1 <0)),B2 + C1,B2)

这个公式是总的,但不是一个真正的公式。 B2 + C1是运行总计的实际等值。 只要达到条件,我的运行总计就会根据上一次计算中的值进行重置。 我尝试使用一些SAP提供的窗口函数,但是这些函数不允许将上一行的计算列用于其他计算。 我能找到的最接近的匹配是重用变量,但HANA尚不支持此功能。 由于我的计算是递归的,因此我使用循环来实现此目的,但是它很慢。 我试图看看是否有更好的方法来计算此值而没有循环?

我想要的最终结果是:

日期值CalcFld
 6/3/2019 -50 -50
 6/15/2019 25 -25
 6/25/2019 20 -5
 7/28/2019 -41 -46
 8/6/2019 -41 -87
 8/18/2019 -27 -114
 10/18/2019 90 -24
 10/19/2019 90 66
 11/2/2019 -16 -16
 11/2/2019 61 45
 11/20/2019 -30 -30
 2019年11月28日95 65
 12/30/2019 -18 -18
 2020年1月1日76 58
 2020/2/1 14 14
 2020年2月9日36 36
 2020年2月21日48 48
 3/4/2020 -38 -38
 2020年4月18日41 3
 5/14/2020 46 46
 2020年5月26日62 62
 5/27/2020 -22 -22
 6/8/2020 61 39
 2020年8月30日77 77
 2020年10月7日59 59
 2020年11月15日51 51
 12/19/2020 18 18
 2021年1月12日26 26
 1/24/2021 82 82
 2/18/2021 10 10
 20/11/3 -37 -37
 4/5/2021 -17 -54
 6/16/2021 85 31
 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

我有一个具有以下值的表:

日期值
 6/3/2019 -50
 6/25/2019 20
 7/28/2019 -41
 8/6/2019 -41
 8/18/2019 -27
 2019年10月18日90
 2019年10月19日90
 11/2/2019 -16
 11/2/2019 61
 11/20/2019 -30
 2019年11月28日95
 12/30/2019 -18
 2020年1月1日76
 2020年2月1日14
 2020年2月9日36
 2020年2月21日48
 3/4/2020 -38
 2020年4月18日41
 5/14/2020 46
 2020年5月26日62
 5/27/2020 -22
 6/8/2020 61
 2020年8月30日77
 2020年10月7日59
 2020年11月15日51
 2020年12月19日18
 2021年1月12日26
 1/24/2021 82
 2/18/2021 10
 20/11/3 -37
 4/5/2021 -17
 6/16/2021 85
 

我想在此表上执行SELECT,并在"值"字段上进行计算。 如果您将上述数据剪切粘贴到Excel中,则第三列的公式为:

= IF(OR(AND(AND(B2> 0,C1 <0),AND(B2 <0,C1 <0)),B2 + C1,B2)

这个公式是总的,但不是一个真正的公式。 B2 + C1是运行总计的实际等值。 只要达到条件,我的运行总计就会根据上一次计算中的值进行重置。 我尝试使用一些SAP提供的窗口函数,但是这些函数不允许将上一行的计算列用于其他计算。 我能找到的最接近的匹配是重用变量,但HANA尚不支持此功能。 由于我的计算是递归的,因此我使用循环来实现此目的,但是它很慢。 我试图看看是否有更好的方法来计算此值而没有循环?

我想要的最终结果是:

日期值CalcFld
 6/3/2019 -50 -50
 6/15/2019 25 -25
 6/25/2019 20 -5
 7/28/2019 -41 -46
 8/6/2019 -41 -87
 8/18/2019 -27 -114
 10/18/2019 90 -24
 10/19/2019 90 66
 11/2/2019 -16 -16
 11/2/2019 61 45
 11/20/2019 -30 -30
 2019年11月28日95 65
 12/30/2019 -18 -18
 2020年1月1日76 58
 2020/2/1 14 14
 2020年2月9日36 36
 2020年2月21日48 48
 3/4/2020 -38 -38
 2020年4月18日41 3
 5/14/2020 46 46
 2020年5月26日62 62
 5/27/2020 -22 -22
 6/8/2020 61 39
 2020年8月30日77 77
 2020年10月7日59 59
 2020年11月15日51 51
 12/19/2020 18 18
 2021年1月12日26 26
 1/24/2021 82 82
 2/18/2021 10 10
 20/11/3 -37 -37
 4/5/2021 -17 -54
 6/16/2021 85 31
 
付费偷看设置
发送
2条回答
SAP浪
1楼-- · 2020-09-08 18:19

我创建的表的结构与您的示例相同:

 CREATE TABLE DATE_TEST("日期" DATE,"值" INT)


 插入DATE_TEST VALUES('2019-06-03',-50);
 INSERT INTO DATE_TEST VALUES('2019-06-15',25);
 插入DATE_TEST VALUES('2019-06-25',20);
 插入DATE_TEST VALUES('2019-07-28',-41);
 插入DATE_TEST VALUES('2019-08-06',-41);
 插入DATE_TEST VALUES('2019-08-18',-27);
 插入DATE_TEST VALUES('2019-10-18',90);
 插入DATE_TEST VALUES('2019-10-19',90);
 插入DATE_TEST VALUES('2019-11-02',-16);
 插入DATE_TEST VALUES('2019-11-02',61);
 插入DATE_TEST VALUES('2019-11-20',-30);
 插入DATE_TEST VALUES('2019-11-28',95);
 插入DATE_TEST VALUES('2019-12-30',-18);
 插入DATE_TEST VALUES('2020-01-21',76);
 插入DATE_TEST VALUES('2020-02-01',14);
 插入DATE_TEST VALUES('2020-02-09',36);
 插入DATE_TEST VALUES('2020-02-21',48);
 插入DATE_TEST VALUES('2020-03-04',-38);
 插入DATE_TEST VALUES('2020-04-18',41);
 插入DATE_TEST VALUES('2020-05-14',46);
 插入DATE_TEST VALUES('2020-05-26',62);
 插入DATE_TEST VALUES('2020-05-27',-22);
 插入DATE_TEST VALUES('2020-06-08',61);
 插入DATE_TEST VALUES('2020-08-30',77);
 插入DATE_TEST VALUES('2020-10-07',59);
 插入DATE_TEST VALUES('2020-11-15',51);
 插入DATE_TEST VALUES('2020-12-19',18);
 插入DATE_TEST VALUES('2021-01-12',26);
 插入DATE_TEST VALUES('2021-01-24',82);
 插入DATE_TEST VALUES('2021-02-18',10);
 插入DATE_TEST VALUES('2021-03-11',-37);
 插入DATE_TEST VALUES('2021-04-05',-17);
 插入DATE_TEST VALUES('2021-06-16',85);
 

然后使用WHILE语法应用以下逻辑:

 DO
 开始


 DECLARE COUNTER INT:= 1;
 DECLARE MAX_RECORDS INT;

 从DATE_TEST选择COUNT(*)进入MAX_RECORDS;


 ALL_VALUES =
 选择
 ROW_NUMBER()OVER(按"日期"排序)" ID",
 "日期",
 "值",
 "值" AS"新值"
 从
 DATE_TEST;

 NEW_VALUES =
 选择 *
 从
 :ALL_VALUES
 哪里
 ID =:COUNTER;

 当计数器<= MAX_RECORDS-1


 做

 NEW_VALUES =

 选择
 NEXT_V。" ID",
 NEXT_V。"日期",
 NEXT_V。"值",
 当(NEXT_V。" Value"> 0 AND CURR。" New_value" <0)或(CURR。" New_value" <0 AND NEXT_V。" Value" <0)时的情况。CURR。" New_value" + NEXT_V。" Value" ELSE  NEXT_V。"值" END AS"新值"
 从
 :NEW_VALUES CURR
 左联接:ALL_VALUES NEXT_V ON CURR.ID + 1 = NEXT_V.ID
 哪里
 CURR.ID =:COUNTER

 联盟

 选择
 "ID",
 "日期",
 "值",
 "新值"
 从
 :NEW_VALUES;

 COUNTER =:COUNTER + 1;

 结束时;

 SELECT * FROM:NEW_VALUES按ID排序;

 结束
 

它应该给您想要的结果。

当学会了学习
2楼-- · 2020-09-08 18:20

感谢您的回复。 我现在有类似的设置。 我一直在寻找没有循环的解决方案。 循环运行非常慢。

谢谢

一周热门 更多>