You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:58:16