复杂的HANASQL 列表转多行

前言

基于HANA的内存数据库的强大性能, SAP建议把业务逻辑下沉到HANA中计算.以便减少应用服务器的负担,让程序性能更好一些.

SAP本身的一些复杂的业务逻辑比如MRP运算(MD01)也有了新的事务 MD01N (MRP LIVE),性能得以巨大的提升

报表类的数据分析程序尤其适用此原则. 

动态报表强化了这个方式,详见链接

无峰,公众号:ABAP 技巧与实战动态报表D-Query简介

复杂的HANASQL系列,主要介绍项目中一些复杂业务逻辑的SQL实现

本文主要介绍怎么用SQL把列表转置成多条记录

8fbce71dd8c7a1f231fd155d227da6d1.png

开发方式

基于计算下沉到数据的原则, SAP给出了基于数据库层级的开发方式,其中比较常用两种方式(有时,这两种方式要结合起来使用)

  • CDS视图 

  • AMDP (ABAP Managed Database Procedures)

开发方式介绍详见链接

无峰,公众号:ABAP 技巧与实战ABAP基础知识 怎么访问HANA数据库中的其它CATALOG的表

概念

列表转置成多条记录,

一些流行的数据库产品特别提供了函数做这个转换. 比如SQL SERVER 数据库中有PIVOT 和UNPIVOT 函数来处理这种转换.大家可以用关键字 PIVOT 查询,可以找到很多这样的文章.

比如下面的链接

https://blog.csdn.net/ycc9957/article/details/89335200

也可以参考文章理解行表列表的转换,详见链接

无峰,公众号:ABAP 技巧与实战ABAP基础知识 行表与列表的转换

示例

为了解释这个概念, 我门看一个的简单示例

比如表ZTTS_COL 有三个类似的字段,

COL001, COL002 ,COL003

e569e307cf4032767de9ffeaf79e521d.png

数据内容呈现为:

b8ffe52d933556257e4ad44e86c6a694.png

希望通过视图查询到如下记录, 在这个查询中, 一条记录的三个字段,转换成三条记录呈现.

d4b669f71f0554ad715adf005b856e41.png

实现方式一 CROSS JOIN

HANASQL实现

如下的HANA SQL语句可以实现上述转换. 其中

SERIES_GENERATE_INTEGER(1, 0, 3)

和MAP 函数是这个语句的核心. MAP 函数用于把特定字段的特定值隐射到另外的字段或值上面.

a642b07332ef78abf8186a07e35c4e3d.png

SERIES_GENERATE_INTEGER(X,Y,Z)

X :标识序列的累加值

Y :标识序列的开始值

Z :标识序列的最大值

输出的ELEMENT_NUMBER 标识序列的行号

为了更好的理解 

可以看这个SQL语句的结果.

d41669988d84341778558718cbb89a01.png

3def36c884b7b3a042d936580e189c29.png

58ec45b5d4f8d1dfe763473a505416c6.png

fd6a33942b2ddbc1c5f9ea3f87b9d48c.png

通过CDS视图结合 AMDP 使用HANA SQL

通过下面方式实现的CDS TABLE FUNCTION 无法用SE16N访问. 但是可以用程序访问 . 如果需要SE16N访问, 还需要创建一个通常的CDS视图从 ZCDS_TS_COL_LINE中读取数据.

CDS TABLE FUCNTION

afcc3e26982932b80b2bed60b904b673.png

AMDP 类 这个类只能在ECLIPSE中创建,修改.

a1962d7e55a619f1f651ec95049a1f79.png

实现方式二 UNION

 UNION语句同样可以实现列表转多行的.

但如果字段多的时候, UNION语句实现的SQL会非常复杂. 

并且从性能上理解 UNION 应该比 CROSS JOIN 方式性能差. 这个我没有测试过. 感兴趣的读者可以比较一下这两种方式的性能差异.

e6974eec846e2f9ebbd77ad78dd56c53.png

业务实践

KEPH表记录了销售订单的标准成本评估的统计结果(按成本组成统计到字段KSTNNN中. CKIS 记录了标准成本评估的明细,期望通过 CKIS-ukaln关联 KEPH-KALNR 获取下级物料的标准成本评估 .

KEPH是列表, 字段KSTNNN 表达了特定的成本组成的金额. (配置表TCKH3保存了二者的关系)

CKIS是行表 (ELEMT , WERTN 表达了成本组成 的金额 )

为了关联KEPH 和CKIS . 需要把KEPH 列表转多行.

转置前的内容

02172cb65cb08867873906c58e64ecc8.png

按上述方式转置后的输出

8f672e399bcd59d3ac6b903caecee716.png

总结

SAP HANA 没有提供列表转多行的标准函数UNPIVOT .基于项目中的需求, 

开始期望用UNION 实现, 后来发现SQL语句太大了. 担心后续维护问题, 才转用CROSS JOIN +SERIES_GENERATE_INTEGER实现.

在BING中搜索出这种实现方式.

详见链接

https://blogs.sap.com/2019/05/14/split-table-column-value-into-multiple-rows-using-sql-in-sap-hana/

与链接

https://blogs.sap.com/2019/04/21/how-to-pivotunpivot-in-sap-hana/

其中关键字UNPIVOT是询问CHATGPT 获取的.

后续有时间尝试一下多行转列的方式(PIVOT).

THE

END

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

    (如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)

请微信联系管理员: 

syjf1976 

sharry_xlp  

Yannick_Duan 

申请进入公众号讨论群提问或者参与话题讨论

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值