复杂的 HANASQL 列表转多行

作者:ABAP技巧与实战 约 7 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Basis, Data Engineering, SD, WM, 仓库管理, 开发, 数据工程, 系统管理, 销售分销
复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)

前言

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

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

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

> 动态报表强化了这个方式, 详见链接 无峰,公众号:ABAP 技巧与实战 [ 动态报表D-Query简介

> ](http://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486429&idx=1&sn=8cbab08040255baa4c7495e6e106230d&chksm=cf5dd6ebf82a5ffdf6cd2cca5ef3b3a298dcb7e3aac2b4cae5073af9c6720bf57b5544c57a49#rd)

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

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

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

开发方式

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

• CDS视图

• AMDP (ABAP Managed Database Procedures)

> 开发方式介绍详见链接 无峰,公众号:ABAP 技巧与实战 [ ABAP基础知识 怎么访问HANA数据库中的其它CATALOG的表

> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247487740&idx=1&sn=06f69f335cdab7004e9db430d1d44f35&chksm=cf5dcdcaf82a44dcae6d181c2116b2c1f287c5126e176e3a1826183847933f091ca39f651749&token=483085029&lang=zh_CN#rd)

概念

列表转置成多条记录,

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

PIVOT 查询,可以找到很多这样的文章.

比如下面的链接

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

> 也可以参考文章理解行表列表的转换,详见链接 无峰,公众号:ABAP 技巧与实战 [ ABAP基础知识 行表与列表的转换

> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486243&idx=1&sn=ff39c4e06d9776ff3f7cd9dc0755d164&chksm=cf5dd615f82a5f03d8e37ee2f6cae503102f393e957ded84083f48707cfc34585868e0594a82&token=483085029&lang=zh_CN#rd)

示例

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

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

COL001, COL002 ,COL003

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

数据内容呈现为

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

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

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

实现方式一 CROSS JOIN

HANASQL实现

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

SERIES_GENERATE_INTEGER(1, 0, 3)

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

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

SERIES_GENERATE_INTEGER(X,Y,Z)

X :标识序列的累加值

Y :标识序列的开始值

Z :标识序列的最大值

输出的ELEMENT_NUMBER 标识序列的行号

为了更好的理解

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

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

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

通过下面方式实现的CDS TABLE FUNCTION 无法用SE16N访问. 但是可以用程序访问 . 如果需要SE16N访问,

还需要创建一个通常的CDS视图从 ZCDS_TS_COL_LINE中读取数据.

CDS TABLE FUCNTION

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

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

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

实现方式二 UNION

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

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

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

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

业务实践

KEPH表记录了销售订单的标准成本评估的统计结果(按成本组成统计到字段KSTNNN中. CKIS 记录了标准成本评估的明细,期望通过 CKIS-

ukaln关联 KEPH-KALNR 获取下级物料的标准成本评估 .

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

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

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

转置前的内容

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

按上述方式转置后的输出

复杂的 HANASQL 列表转多行 - 封面图
复杂的 HANASQL 列表转多行 - 封面图

总结

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

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

ABAP技巧与实战

关于作者:ABAP技巧与实战

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「复杂的HANASQL列表转多行.md」整理生成,仅用于内部技术分享与学习交流。