点击此处---> 群内免费提供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专家分享他们的专业建议?
首先,这种机制不是HANA的功能,但这是标准SQL语法的样子。 在这种情况下,您将不可能在单个SELECT中引用别名。
如上所述,您需要使用嵌套的SELECT或将结果集分配给变量,然后使用此变量作为引用,例如:
一周热门 更多>