OpenSQL 中 GROUP BY 子句中的通配符?

Wildcards in GROUP BY clause in OpenSQL?

我有一个 select 类似于下面的:

SELECT DISTINCT
  SCARR~CARRID,
  SCARR~CARRNAME,
  MIN( SPFLI~DISTANCE ) AS MIN_DISTANCE
FROM SCARR JOIN SPFLI ON SPFLI~CARRid = SCARR~CARRid
GROUP BY 
  SCARR~CARRID, 
  SCARR~CARRNAME
INTO TABLE @DATA(result).

在实际情况下,这些是其他 table,我在 SELECTGROUP BY 中都有更多字段。

我可以简化 GROUP BY 以便不必再次编写 table SCARRSELECT 子句中的所有字段吗?

我知道其他选项是对 table SCARR 的所有字段使用 MIN 除了它的 ID,或者不使用 GROUP BY 而是在 select,但我试图做类似 GROUP BY scarr~*

的事情

No, the OpenSQL syntax doesn't support this.

这是一种使用动态方法的可能解决方法:

DATA: lcl_struc  TYPE REF TO cl_abap_structdescr,
      lt_grouped TYPE TABLE OF sflight.

lcl_struc ?= cl_abap_typedescr=>describe_by_name( 'SFLIGHT' ).

DATA(group_by) = REDUCE string( INIT line TYPE char1024 FOR <field> IN lcl_struc->get_components( ) NEXT line = COND #( WHEN line <> space THEN line && `, ` &&  `SFLIGHT~` && <field>-name  ELSE line && `SFLIGHT~` && <field>-name ) ).

 SELECT (group_by)
   FROM scarr  LEFT OUTER JOIN spfli
     ON spfli~carrid = scarr~carrid
   LEFT OUTER JOIN sflight
     ON sflight~carrid = spfli~carrid
    AND sflight~connid = spfli~connid
   LEFT OUTER JOIN sairport
     ON sairport~id = spfli~airpfrom
  WHERE scarr~carrid = 'AA'
  GROUP BY (group_by)
   INTO CORRESPONDING FIELDS OF TABLE @lt_grouped.

注意这里的几个限制:

  1. 在上面的示例中,我仅按 SFLIGHT 字段分组,因为当指定通配符字段和单个 (SELECT spfli~*, sflight~carrid) 时,内联结果 table 将没有单个字段,但 sub-structures,所以它处理起来更复杂或者需要显式声明。如果您需要加入 tables.
  2. 分组,请记住这一点
  3. 正如 Florian 提供的帮助章节中所述,动态组子句需要全有或全无:

The columns after SELECT must then be specified either solely as arguments of aggregate functions or only directly. If not, this would raise a handleable exception CX_SY_OPEN_SQL_DB. Invalid syntax raises a handleable exception from the class CX_SY_DYNAMIC_OSQL_ERROR.

因此,如果您需要单字段聚合,它在您的特定情况下可能没用,但以防万一我把它放在这里。

否在普通 OpenSQL 中是不可能的。

您可以为聚合SPFLI创建一个新的CDS视图,该视图return为每个CARRID最小距离:

define view Z_CDS_SPFLI_MIN as select from SPFLI
{
  carrid, 
  min( distance ) as min_distance
}
group by carrid

然后您可以像这样修改您的查询,而不使用分组依据:

select SCARR~*, Z_CDS_SPFLI_MIN~min_distance
  from SCARR
     inner join Z_CDS_SPFLI_MIN
       on SCARR~carrid = Z_CDS_SPFLI_MIN~carrid.