如何在ABAP SQL/CDS视图中将多行合并为单行(GROUP BY)?
在ABAP SQL/CDS视图中合并同一CHARG的多行结果
当前CDS输出
* RESULT CDS VIEW *---------------------------- *|CHARG|Z_F1 |Z_F2 |Z_F3 | *---------------------------- *|011 |VAL F1| | | *|011 | |VAL F2| | *|011 | | |VAL F3| *----------------------------
期望输出
* EXPECTED RESULT *---------------------------- *|CHARG|Z_F1 |Z_F2 |Z_F3 | *---------------------------- *|011 |VAL F1|VAL F2|VAL F3| *----------------------------
需求说明
需要用纯CDS实现按CHARG分组合并多行结果,不能编写ABAP代码,同时满足系统对GROUP BY子句的要求。
补充背景:Z_F1~Z_F3是基于字段_f1的透视结果,这也是初始数据分散在多行的原因,当前核心CDS代码如下:
... as select...{ charg, case when _f1 = '1' then 'VAL F1' else '' end as Z_F1, case when _f1 = '2' then 'VAL F2' else '' end as Z_F2, case when _f1 = '3' then 'VAL F3' else '' end as Z_F3 ... }
纯CDS解决方案
直接用ABAP SQL的MAX()聚合函数包裹每个透视字段,再按CHARG分组即可,修改后的代码示例:
... as select...{ charg, max( case when _f1 = '1' then 'VAL F1' else '' end ) as Z_F1, max( case when _f1 = '2' then 'VAL F2' else '' end ) as Z_F2, max( case when _f1 = '3' then 'VAL F3' else '' end ) as Z_F3 } group by charg ...
原理说明
- 同一
CHARG分组下,每个Z_F字段仅一行是非空值,其余均为空字符串。MAX()函数会自动选取分组内的非空值,过滤掉空字符串,最终合并为单行结果。 - 根据ABAP SQL规则,被聚合函数包裹的字段无需出现在GROUP BY子句中,仅需将
charg放入GROUP BY即可,完全符合系统要求。
内容的提问来源于stack exchange,提问作者toffler
相关产品推荐
相关产品推荐

