Агрегированное поле ABAP CDS для использования SUM или MIN в зависимости от условия

Я хотел бы знать, возможно ли SUM, если поле имеет определенное значение, в противном случае принимайте только MIN (только одно значение из агрегированных записей)

Я пробовал что-то подобное, но это синтаксически неверно, поэтому я ищу альтернативу для этого:

SELECT FROM ZCDS
FIELDS ZCDS~networkID as networkID,
       ZCDS~assignment as assignment,
       CASE 
         WHEN ZCDS~assignment = 'N'
         THEN MIN( ZCDS~amount )
         ELSE SUM( ZCDS~amount )
       END as amount
GROUP BY ZCDS~networkID, ZCDS~assignment
INTO TABLE @DATA(result).

Возможно, есть способ определить, не равна ли СУММ уже 0, а затем использовать случай, чтобы прекратить добавление дополнительной суммы. Но я не знаю, как получить доступ к промежуточному значению SUM в CASE, вероятно, это тоже невозможно.

Ожидаемый ввод:

+----+-----------+------------+--------+
| ID | NetworkID | Assignment | Amount |
+----+-----------+------------+--------+
|  1 | D/01      | N          |      7 |
|  2 | D/01      | N          |      5 |
|  3 | D/01      | U          |     15 |
|  4 | D/01      | U          |     11 |
|  5 | D/02      | N          |     40 |
|  6 | D/02      | N          |     42 |
+----+-----------+------------+--------+

Ожидаемый результат:

+-----------+------------+--------+
| NetworkID | Assignment | Amount |
+-----------+------------+--------+
| D/01      | N          |      5 |
| D/01      | U          |     26 |
| D/02      | N          |     40 |
+-----------+------------+--------+

person RaTiO    schedule 04.03.2020    source источник


Ответы (2)


Конечно, выход есть. Используйте HAVING SUM(ZDS~amount) после GROUP BY.

SELECT FROM ZCDS
FIELDS ZCDS~ID as ID,
       ZCDS~assignment as assignment,
       CASE 
         WHEN ZCDS~assignment = 'N'
         THEN MIN( ZCDS~amount )
         ELSE SUM( ZCDS~amount )
       END as amount
GROUP BY ZCDS~ID, ZCDS~assignment
HAVING SUM( ZCDS~amount ) = 0
INTO TABLE @DATA(result).
person Jagger    schedule 05.03.2020
comment
В моем примере есть предполагаемая синтаксическая ошибка, вы не можете использовать MIN и MAX внутри CASE (насколько мне известно). Я хочу знать, есть ли альтернатива для достижения этой цели. - person RaTiO; 10.03.2020
comment
@Ratio, вы не можете использовать MIN / MAX внутри case, но вы можете использовать CASE внутри MIN следующим образом HAVING MIN( CASE m1~shkzg WHEN 'H' THEN 1 WHEN 'S' THEN -1 ELSE 0 END * m1~menge ). Все зависит от ваших требований, без ожидаемого ввода / вывода я не могу посоветовать что-то более конкретное - person Suncatcher; 24.03.2020
comment
@Suncatcher Спасибо, я добавил пример ввода / вывода. - person RaTiO; 24.03.2020

Когда вы ставите слово CDS в заголовок вопроса, я предлагаю вам решение CDS. Я воссоздал структуру вашей таблицы и могу подтвердить, что этот код работает как минимум на ABAP 7.50.

@AbapCatalog.sqlViewName: 'zsql_assign'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'assignment'
define view ZCDS_ASSIGN as select from zfilter {
    key networkid,
    key assignment,
    case assignment when 'U' then sum( amount )
                    else          min( amount )
    end as amount
} group by networkid, assignment;

Результат этого запроса:

введите здесь описание изображения

В классическом ABAP (OpenSQL) это все еще невозможно.

person Suncatcher    schedule 10.04.2020