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

COLLECT by year in date field?

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

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

我的table

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 进行第二次循环并进行另一次收集?

编辑

我有一个全局 table:

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

我希望本地 table 看起来像什么:

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

然后汇总:

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

不幸的是,COLLECT 语句不是很灵活。它会将内部 table 的主键视为要聚合的键。如果您在声明 table 时没有明确声明主键,那么这意味着所有非数字字段。并且没有办法告诉它在聚合之前对键或值执行任何转换。


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

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

但更现代的解决方案可能是

从 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, product, LEFT( date, 4 ).