SAP HANA是否具有与SAP BEX QUERY DESIGNER选择功能相似的功能?

2020-09-09 22:38发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)亲爱的人们, Coz最近我在...

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

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


亲爱的人们,

Coz最近我在一个非常大的HANA开发项目中工作,我发现了一个非常愚蠢的设计机制,尤其是当我们需要在一个sql语句中计算一些度量时,例如:A-B + C =D。 :

选择客户端ID,

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(A)则为0结束的情况) 为" A",

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时加和(B)则为0结束的情况) 为" B",

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(C)则为0结束的情况) 为" C"

从表名

组别

clientid。

有趣的是,当我们需要计算度量D时,我们需要复制很长的sql进行计算。

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(A)则为0结束的情况) -(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且运动类型='xx'和specialInventoryflag ='X'时加和(B)则为0结束的情况) > +(当存储位置位于(1,2,3,4,5,6,7,8,9,10)中且运动类型='xx'和specialInventoryflag ='X'时加和(C)则为0结束的情况)AS D。

我知道有些人可能会建议我可以调用另一个sql语句来嵌套代码,以降低代码复杂性。

代码如下:

选择clientid," A"," B"," C",(A-B + C)AS D FROM(

选择客户端ID,

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(A)则为0结束的情况) 为" A",

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(A)则为0结束的情况) 为" B",

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(A)则为0结束的情况) 为" C"

从表名

组别

clientid

可以肯定,我承认上面的sql设计是绝对合理的,但是为什么我们不能一次性编译sql代码呢?

我认为,如果我们能够确定像bex查询的选择功能这样的临时变量,那么一次确定代码并进行编译应该会更容易。

这是我对上述代码的思考,如下所示:

选择客户端ID,

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(A)则为0结束的情况) 为" A" @A,

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时加和(B)则为0结束的情况) 为" B" @B,

(当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时求和(C)则为0结束的情况) 为" C" @C

@A-@B + @C AS" D"

从表名

组别

clientid。

一次性读取和编译sql引擎要容易得多。

这只是我个人的观点,有没有任何SAP HANA专家分享他们的专业建议?

1条回答
吹牛啤
2020-09-09 23:31 .采纳回答

首先,这种机制不是HANA的功能,但这是标准SQL语法的样子。 在这种情况下,您将不可能在单个SELECT中引用别名。

如上所述,您需要使用嵌套的SELECT或将结果集分配给变量,然后使用此变量作为引用,例如:

 DO
 开始

 CALC_RESULT =

 选择
 客户编号,
 (当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时,求和(A)否则为0结束)为" A  ",
 (当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时,则sum(A)否则为0结束)  ",
 (当(1,2,3,4,5,6,7,8,9,10)中的存储位置且移动类型='xx'和specialInventoryflag ='X'时,求和(A)否则为0的结尾)作为" C  "
 从
 表名
 通过...分组
 客户编号
 ;

 选择
 clientid,A,B,C(A-B + C)
 从
 :CALC_RESULT
 ;

 结束
 

一周热门 更多>