是否可以count
记录left join
?我希望看到count
返回已加入的实际记录(如果没有剩余的加入,则包括0
)。
如下所示的联接在我使用过的其他SQL形式中也起作用,但是OpenSQL似乎不支持count([column])
:
select header~key, count(item~key)
from header left join item on header~key = item~header_key
group by header~key.
我知道以下查询有效,但是如果没有items
与标头连接,则计数仍为1 而不是0:
select header~key, count(*) from header left join item group by header~key.
目前,我需要使用abap(loop
和loop at
加上group
)来计数需要的时间。
在目前的情况下,我正在处理事务数据,与我以前的项目相比,这是海量数据,并且额外的循环会大大增加处理时间。
答案 0 :(得分:1)
似乎DISTINCT是强制性的,即COUNT( DISTINCT col )。
这适用于7.52。
编辑:与Suncatcher讨论后,我删除了我的第一个查询,并在下面添加了更详细的答案。
当然DISTINCT不会计算重复值,因此您可以计算主键所有列的串联(DISTINCT CONCAT(…))。
让我向您展示SCARR和SPFLI的内容,以及最终结果。
表SCARR:
CARRID
------
FJ
JL
LH
NG
表SPFLI:
CARRID CONNID
------ ------
JL 0407
JL 0408
LH 0400
LH 0401
LH 0402
LH 2402
打开SQL:
SELECT s~carrid, COUNT( DISTINCT CONCAT( p~carrid, p~connid ) ) AS count
FROM scarr AS s
LEFT OUTER JOIN spfli AS p ON s~carrid = p~carrid
GROUP BY s~carrid
WHERE s~carrid IN ('FJ','JL','LH','NG')
INTO TABLE @DATA(itab).
结果:
CARRID COUNT
------ ------
FJ 0
JL 2
LH 4
NG 0
答案 1 :(得分:0)
从某种意义上说,查询结果正确无误:
如果左联接的定义不匹配,则左联接为您提供右表的空值。如果您选择右表的更多列(即1),则会计算出右表的空值。
因此SAP正在支持计数,您将获得正确的结果(而不是您想要的结果)。
您要做的是单独选择要计数的项目。 注意:如果这样做,即使没有项目,sy-subrc也将始终为0。
这可能令人惊讶,但也是正确的,因为您得到的结果是count = 0。
答案 2 :(得分:0)
这是OpenSQL的一个有趣的错误(或功能?),在我的系统上,我确认了这一点。
SAP在implementation specifics of SQL engine中进行了解释:
传递给数据对象时,空值将转换为 类型相关的初始值
因此,并非SAP DB数据库字段中的所有空值都为空,SAP经常将这些空值视为有效值。
我在字段EKGRP
的MARA / MARC表上测试了该用例,并确认COUNT
对我的数据的行为很奇怪,当EKGRP
为空或具有初始值。
我的建议:比较所有可能包含比较字段(在您的情况下为item-key
的空值/ NULL值/变量,并在JOIN ON
条件下进行检查( !)不在WHERE
子句中。
查看示例:
SELECT mara~matnr, COUNT( DISTINCT marc~ekgrp ) AS count
FROM mara
LEFT OUTER JOIN marc
ON mara~matnr = marc~matnr
AND marc~ekgrp IS NOT NULL
AND marc~ekgrp NE ''
AND marc~ekgrp NE '000'
GROUP BY mara~matnr, marc~ekgrp
INTO TABLE @DATA(tab).
总而言之,这高度依赖于数据库并且取决于字段类型,因此这里没有简单的方法。 SAP写道:
但是,根据数据库系统的不同,空字符串也可以是 显示为空值。