问题描述
我想按名称、商品、日期(年份)和价格对内部表中的值求和,但问题是我的 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 语句,则可能的解决方法是:
- 为您的总和结构创建一个单独的类型,其中仅包含您想要的字段。如果您希望仅用年份表示日期,请创建一个单独的 GJAHR 类型字段(或您首选的
TYPE n LENGTH 4
) - 创建一个表格和该类型的工作区
- 在您的循环中,将日期写入工作区 (
wa_sum-year = wa_table-date(4).
) 的新 4 位数日期。您可以用MOVE-CORRESPONDING
填充其余部分。 - 将您的输出工作区收集到您的输出表中。
但更现代的解决方案可能是 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 ).