Abap OpenSQL中GROUPBY子句中的通配符?

Abap OpenSQL中GROUPBY子句中的通配符?,abap,opensql,Abap,Opensql,我有一个类似于下面的选择: 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). 在实际情况中,这些是其他表,我在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).
在实际情况中,这些是其他表,我在SELECT和GROUPBY中有更多的字段

我可以通过不必再次写入表SCAR中SELECT子句中的所有字段来简化组吗


我知道其他选项是对表SCARR的所有字段(ID除外)使用MIN,或者不按分组,而是在选择后删除重复项,但我尝试执行类似于按SCARR分组的操作~*

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

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.
请注意以下几个限制:

在上面的示例中,我仅按SFLIGHT字段分组,因为当指定通配符字段和single SELECT spfli~*时,SFLIGHT~将包含内联结果表,而不是单个字段,因此它的处理更复杂,或者需要显式声明。如果需要按联接表分组,请记住这一点。 正如Florian提供的帮助一章所述,dynamic group子句要求全部或全部: 然后,SELECT之后的列必须单独指定为聚合函数的参数,或者直接指定。否则,这将引发一个可处理的异常CX\u SY\u OPEN\u SQL\u DB。无效语法从类CX_SY_DYNAMIC_OSQL_错误引发可处理异常


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

No在普通OpenSQL中是不可能的

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

define view Z_CDS_SPFLI_MIN as select from SPFLI
{
  carrid, 
  min( distance ) as min_distance
}
group by carrid
然后,您可以像这样修改查询,而无需使用group by:

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

我把你的理论问题转化为最小的、可复制的例子,这样人们就可以复制并适应,如果可能的话。谢谢。嗯,我知道我应该能够创建一个动态选择,其中select子句和GROUP_BY是用相同的硬编码字符串生成的,但是我也不太喜欢这个解决方案。@RaTiO每个ABAPer都会将select列复制/粘贴到GROUP BY节中。为什么你需要用不同的方式来做?请记住,您的代码将由其他人维护,因此不要发明人们可能不满意的解决方案。ABAP中的动态SQL通常只是SQL注入功能的另一个术语。所以,最好还是坚持桑德拉斯的建议,保持它的简单易读。我只是在探索各种选择,然后才有一个明确的意见。谢谢你的帮助和推荐!