Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Abap 不带循环地得到总数_Abap - Fatal编程技术网

Abap 不带循环地得到总数

Abap 不带循环地得到总数,abap,Abap,我指的是这个问题和答案。但我的要求要简单得多。我只需要类别及其相应的总数 我的内部表格如下: Category Amount AAA 10 AAA 20 BBB 30 CCC 40 CCC 50 CCC 60 我需要构建内部表,如下所示: Category Amount AAA 30 BBB 30 CCC 150 有人能帮上忙吗?从7.40版及以后,这可以通过将内部表中的分组()与用于计算每个组的总和相结合来

我指的是这个问题和答案。但我的要求要简单得多。我只需要类别及其相应的总数

我的内部表格如下:

Category Amount
AAA     10
AAA     20
BBB     30
CCC     40
CCC     50
CCC     60
我需要构建内部表,如下所示:

Category Amount
AAA       30
BBB       30
CCC       150

有人能帮上忙吗?

从7.40版及以后,这可以通过将内部表中的分组()与用于计算每个组的总和相结合来实现

首先是几个声明:

TYPES:
   BEGIN OF data_struct,
    category TYPE c LENGTH 3,
    amount TYPE i,
   END OF data_struct,
   data_tab TYPE STANDARD TABLE OF data_struct WITH EMPTY KEY.

DATA(input) = VALUE data_tab(
    ( Category = 'AAA' Amount = 10 )
    ( Category = 'AAA' Amount = 20 )
    ( Category = 'BBB' Amount = 30 )
    ( Category = 'CCC' Amount = 40 )
    ( Category = 'CCC' Amount = 50 )
    ( Category = 'CCC' Amount = 60 )
).
这里是解决方案:

DATA(output) = VALUE data_tab(
    FOR GROUPS group OF input_line IN input 
        GROUP BY ( category = input_line-category )
        (   category = group-category
            amount = REDUCE #(
                INIT subtotal = 0
                FOR group_line IN GROUP group
                NEXT subtotal  = subtotal  + group_line-amount 
            ) 
        ) 
).
现在这里到底发生了什么

内部表
输出的数据由组
生成。组的
表表达式由三部分组成:组的声明、分组标准和结果

首先是关于声明性部分:
在input
中对输入行分组。这定义了一个名为“组”的组,其源是内部表“输入”,我们将该源表的每一行称为“输入线”

接下来是分组标准:
groupby(category=input\u line-category)
。这意味着每个组都由一个带有单个字段“category”的键标识,并且我们希望对字段“category”相同的所有行进行分组

现在是结果部分:

( category = group-category
  amount = REDUCE #(
    INIT subtotal = 0
    FOR group_line IN GROUP group
    NEXT subtotal = subtotal + group_line-amount
  )
)
这定义了每个组在输出集中的表示方式。第一个字段“category”很简单-只需输入名为“group”的组的“category”值

第二个字段“amount”有点复杂,因为它的值是由
REDUCE
计算的。REDUCE构造表达式的目的是获取多个值并将它们转换为一个值。它通过执行以下操作来实现这一点:

  • 声明并初始化变量:
    INIT subtotal=0
  • 对组的内部表或外部
    中的组行执行循环。在这种情况下,后者:
    用于组中的组_行
  • 对输入的每一行执行相同的代码段,更改变量。在这种情况下,将其金额添加到小计中:
    NEXT subtotal=subtotal+group\u line-amount
  • 返回步骤1中声明的变量的最终值
  • 调试器的结果:


    您尝试了什么?你的问题是什么?这能回答你的问题吗?OP尝试执行的操作在标准SQL中称为聚合。但是,这在OpenSQL中不可用。谢谢。正是我需要的。也谢谢你的解释。