在日期字段中按年份收集?

问题描述

我想按名称、商品、日期(年份)和价格对内部表中的值求和,但问题是我的 collect 语句不起作用。我认为这与我的 YYYY-MM-DD 日期值有关,因此 collect 语句在 2014-10-12 和 2014-11-12 之间有所不同,并将它们作为两个不同的值插入。

如何更改 collect 语句,使其知道“2014-10-12”与“2014-11-12”相同。

我的桌子

Hans - Mouse - 80 - 2014-12-01
Hans - Mouse - 80 - 2014-05-01
Albert - Keyboard - 50 - 2015-05-04
Albert - Keyboard - 80 - 2015-10-06
Albert - Keybaoard - 100 - 2016-01-01

我想要的

Hans - Mouse - 160 - 2014
Albert - Keyboard - 130 - 2015
Albert - Keybaoard - 100 - 2016

我的代码

SELECT * FROM gv_table INTO CORRESPONDING FIELDS OF wa_table
  WHERE date(4) BETWEEN '20140101' AND '20160101' <-- date(4) is not working. It gives me an error
 

  COLLECT wa_table INTO lt_table.
ENDSELECT.

或者我是否必须通过我的 lt_table 再次循环并再次收集?

编辑

我有一个全局表:

Hans - Mouse - 60 - 2014-12-02
Hans - Mouse - 50 - 2014-12-02
Peter - Keyboard - 40 - 2014-03-02

我希望我的本地表是什么样的:

Hans - Mouse - 60 - 2014
Hans - Mouse - 50 - 2014
Peter - Keyboard - 40 - 2014

然后聚合:

Hans - Mouse 110 - 2014
Peter - Keyboard - 40 - 2014

解决方法

不幸的是,COLLECT 语句不是很灵活。它会将内部表的主键视为要聚合的键。如果在声明表时未声明显式主键,则意味着所有非数字字段。并且无法告诉它在聚合之前对键或值执行任何转换。


如果您坚持使用 COLLECT 语句,则可能的解决方法是:

  1. 为您的总和结构创建一个单独的类型,其中仅包含您想要的字段。如果您希望仅用年份表示日期,请创建一个单独的 GJAHR 类型字段(或您首选的 TYPE n LENGTH 4
  2. 创建一个表格和该类型的工作区
  3. 在您的循环中,将日期写入工作区 (wa_sum-year = wa_table-date(4).) 的新 4 位数日期。您可以用 MOVE-CORRESPONDING 填充其余部分。
  4. 将您的输出工作区收集到您的输出表中。

但更现代的解决方案可能是 create a sum table using the constuctor expressions which were added in SAP_BASIS 7.40

从 SAP_BASIS 7.50(?) 开始,您还可以在 SQL 语句中使用 LEFT 聚合函数来截断数据库中的日期。如果你这样做,你甚至可以让数据库使用 GROUP BY 进行聚合:

SELECT name,product,SUM( quantity ) AS sum,LEFT( date,4) AS year 
  FROM dbtab 
  INTO CORRESPONDING FIELDS OF @wa_table
  WHERE date BETWEEN '20140101' AND '20160101' 
  GROUP BY name,4 ).