一
前言
基于HANA的内存数据库的强大性能, SAP建议把业务逻辑下沉到HANA中计算.以便减少应用服务器的负担,让程序性能更好一些.
SAP本身的一些复杂的业务逻辑比如MRP运算(MD01)也有了新的事务 MD01N (MRP LIVE),性能得以巨大的提升
报表类的数据分析程序尤其适用此原则.
动态报表强化了这个方式,详见链接
无峰,公众号:ABAP 技巧与实战动态报表D-Query简介
复杂的HANASQL系列,主要介绍项目中一些复杂业务逻辑的SQL实现
本文主要介绍怎么用SQL把列表转置成多条记录
二
开发方式
基于计算下沉到数据的原则, 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
数据内容呈现为:
希望通过视图查询到如下记录, 在这个查询中, 一条记录的三个字段,转换成三条记录呈现.
五
实现方式一 CROSS JOIN
HANASQL实现
如下的HANA SQL语句可以实现上述转换. 其中
SERIES_GENERATE_INTEGER(1, 0, 3)
和MAP 函数是这个语句的核心. MAP 函数用于把特定字段的特定值隐射到另外的字段或值上面.
SERIES_GENERATE_INTEGER(X,Y,Z)
X :标识序列的累加值
Y :标识序列的开始值
Z :标识序列的最大值
输出的ELEMENT_NUMBER 标识序列的行号
为了更好的理解
可以看这个SQL语句的结果.
通过CDS视图结合 AMDP 使用HANA SQL
通过下面方式实现的CDS TABLE FUNCTION 无法用SE16N访问. 但是可以用程序访问 . 如果需要SE16N访问, 还需要创建一个通常的CDS视图从 ZCDS_TS_COL_LINE中读取数据.
CDS TABLE FUCNTION
AMDP 类 这个类只能在ECLIPSE中创建,修改.
六
实现方式二 UNION
UNION语句同样可以实现列表转多行的.
但如果字段多的时候, UNION语句实现的SQL会非常复杂.
并且从性能上理解 UNION 应该比 CROSS JOIN 方式性能差. 这个我没有测试过. 感兴趣的读者可以比较一下这两种方式的性能差异.
七
业务实践
KEPH表记录了销售订单的标准成本评估的统计结果(按成本组成统计到字段KSTNNN中. CKIS 记录了标准成本评估的明细,期望通过 CKIS-ukaln关联 KEPH-KALNR 获取下级物料的标准成本评估 .
KEPH是列表, 字段KSTNNN 表达了特定的成本组成的金额. (配置表TCKH3保存了二者的关系)
CKIS是行表 (ELEMT , WERTN 表达了成本组成 的金额 )
为了关联KEPH 和CKIS . 需要把KEPH 列表转多行.
转置前的内容
按上述方式转置后的输出
八
总结
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
申请进入公众号讨论群提问或者参与话题讨论