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注入功能的另一个术语。所以,最好还是坚持桑德拉斯的建议,保持它的简单易读。我只是在探索各种选择,然后才有一个明确的意见。谢谢你的帮助和推荐!