首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenSQL中GROUP BY子句中的通配符?

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

Stack Overflow用户
提问于 2020-04-03 09:47:00
回答 3查看 424关注 0票数 2

我有一个与以下类似的选择:

代码语言:javascript
复制
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).

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

我可以将GROUP BY简化为不必再次从表SCARR中写入SELECT子句中的所有字段吗?

我知道其他选项是对除ID以外的表SCARR的所有字段使用SCARR,或者不对GROUP BY使用,而是在选择之后删除重复项,但我试图执行类似于GROUP BY scarr~*的操作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-03 11:04:42

Stack Overflow用户

发布于 2020-04-06 15:58:40

下面是使用动态方法的一个可能的解决办法:

代码语言:javascript
复制
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)时,内联结果表将没有单个字段,而是子结构,因此处理起来更复杂,或者需要显式声明。如果需要按连接表分组,请记住这一点。
  2. 正如Florian提供的“帮助”一章所述,dynamic子句要求所有或不需要:

然后,必须将SELECT后的列指定为聚合函数的参数或仅直接指定。如果不是,这将引发一个可处理的异常CX_SY_OPEN_SQL_DB。无效的语法会从类CX_SY_DYNAMIC_OSQL_ERROR引发可处理的异常。

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

票数 0
EN

Stack Overflow用户

发布于 2020-04-07 12:06:17

在普通OpenSQL中,No是不可能的。

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

代码语言:javascript
复制
define view Z_CDS_SPFLI_MIN as select from SPFLI
{
  carrid, 
  min( distance ) as min_distance
}
group by carrid

然后,您可以像这样修改查询,而无需使用group:

代码语言:javascript
复制
select SCARR~*, Z_CDS_SPFLI_MIN~min_distance
  from SCARR
     inner join Z_CDS_SPFLI_MIN
       on SCARR~carrid = Z_CDS_SPFLI_MIN~carrid.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61009137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档