COUNT返回带有NULL的LEFT JOIN查询的模糊结果

时间:2018-07-27 11:07:43

标签: count sap abap opensql

是否可以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(looploop at加上group)来计数需要的时间。 在目前的情况下,我正在处理事务数据,与我以前的项目相比,这是海量数据,并且额外的循环会大大增加处理时间。

3 个答案:

答案 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写道:

  

但是,根据数据库系统的不同,空字符串也可以是   显示为空值。