Подстановочные знаки в предложении GROUP BY в Open SQL? - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть выборка, подобная приведенной ниже:

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 и GROUP BY.

Можно ли упростить GROUP BY, чтобы не приходилось снова писать все поля, которые содержатся в предложении SELECT из таблицы SCARR?

Я знаю, что другие варианты использования MIN для всех полей таблицы SCARR за исключением ее идентификатора или не GROUP BY и вместо этого удаляйте дубликаты после выбора, но я пытался сделать что-то вроде GROUP BY scarr~*

Ответы [ 3 ]

3 голосов
/ 03 апреля 2020
0 голосов
/ 07 апреля 2020

Нет невозможно в обычном режиме Открыть SQL.

Вы можете создать новое представление CDS для совокупного SPFLI, при этом представление для каждого 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.
0 голосов
/ 06 апреля 2020

Вот один из возможных обходных путей с использованием динамического подхода c:

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 fields, поскольку при указании полей с подстановочными символами вместе с одиночным (SELECT spfli~*, sflight~carrid) встроенная таблица результатов будет содержать не отдельные поля, а подструктуры , поэтому она более сложна для обработки или требует явного объявления. Помните об этом, если вам нужна группировка по объединенным таблицам.
  2. Как указано в главе справки, предоставленной Florian, динамическое предложение c group требует все или ничего:

Столбцы после SELECT должны указываться либо исключительно в качестве аргументов агрегатных функций, либо только напрямую. Если нет, это вызовет обрабатываемое исключение CX_SY_OPEN_SQL_DB. Неверный синтаксис вызывает обрабатываемое исключение из класса CX_SY_DYNAMIC_OSQL_ERROR.

Так что это может быть бесполезно в вашем конкретном случае, если вам нужна агрегация с одним полем, но на всякий случай я поместил ее здесь.

...