Агрегированное поле ABAP CDS для использования SUM или MIN в зависимости от условия - PullRequest
3 голосов
/ 04 марта 2020

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

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

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).

Может быть, есть способ определить, не является ли SUM уже 0, а затем использовать регистр, чтобы прекратить добавлять больше суммы. Но я не знаю, как получить доступ к промежуточному значению СУММЫ в СЛУЧАЕ, вероятно, это также невозможно

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

+----+-----------+------------+--------+
| 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 |
+-----------+------------+--------+

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Конечно, есть способ. Используйте 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).
0 голосов
/ 10 апреля 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;

Вывод этого запроса:

enter image description here

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

...