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,我在 SELECT
和 GROUP BY
中都有更多字段。
我可以简化 GROUP BY
以便不必再次编写 table SCARR
中 SELECT
子句中的所有字段吗?
我知道其他选项是对 table SCARR
的所有字段使用 MIN
除了它的 ID,或者不使用 GROUP BY
而是在 select,但我试图做类似 GROUP BY 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
字段分组,因为当指定通配符字段和单个 (SELECT spfli~*, sflight~carrid
) 时,内联结果 table 将没有单个字段,但 sub-structures,所以它处理起来更复杂或者需要显式声明。如果您需要加入 tables. 分组,请记住这一点
- 正如 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.
我有一个 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,我在 SELECT
和 GROUP BY
中都有更多字段。
我可以简化 GROUP BY
以便不必再次编写 table SCARR
中 SELECT
子句中的所有字段吗?
我知道其他选项是对 table SCARR
的所有字段使用 MIN
除了它的 ID,或者不使用 GROUP BY
而是在 select,但我试图做类似 GROUP BY 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
字段分组,因为当指定通配符字段和单个 (SELECT spfli~*, sflight~carrid
) 时,内联结果 table 将没有单个字段,但 sub-structures,所以它处理起来更复杂或者需要显式声明。如果您需要加入 tables. 分组,请记住这一点
- 正如 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.