Добавление промежуточной суммы к столбцу в запросе Firebird SQL - PullRequest
1 голос
/ 27 апреля 2019

Мне нужно видеть промежуточный итог в моем поле AMOUNT каждый раз, когда происходит изменение в ПОЛЕ LEDGER_ACCOUNT

Я провел много исследований по этому вопросу, и похоже, что это работа для союза. Но я не могу заставить объединение добавлять итоги каждый раз, когда происходит изменение

Мой текущий запрос на выборку выглядит следующим образом:

ВЫБРАТЬ L.LEDGER_ACCOUNT, CURRROUND (L.DEBIT, 2) - CURRROUND (L.CREDIT, 2) AS AMOUNT ОТ LEDGER L

На данный момент отображаются следующие поля:

enter image description here

Но мне нужно следующее возвращение:

enter image description here

Я использую Firebird 2.5.7.

1 Ответ

1 голос
/ 28 апреля 2019

В Firebird 2.5 вы можете добиться желаемого результата, используя объединения и некоторую дополнительную логику, чтобы иметь возможность вставлять промежуточные итоги и итоги в нужное место.Используя упрощенную таблицу LEDGER с данными, как вы показали, вы можете использовать следующий запрос:

SELECT 
    CASE LTYPE 
        WHEN 0 THEN CAST(ledger_account AS VARCHAR(50))
        WHEN 1 THEN 'Subtotal'
        WHEN 2 THEN 'TOTAL'
    END AS LEDGER_ACCOUNT_DISPLAY,
    AMOUNT
FROM (
    SELECT ledger_account, amount, 0 AS LTYPE
    FROM ledger
    UNION ALL
    SELECT ledger_account, SUM(amount), 1 AS LTYPE
    FROM ledger
    GROUP BY ledger_account
    UNION ALL
    -- BIN_SHL(1, 31) - 1 produces the maximum value of INTEGER; for sorting total at end
    SELECT BIN_SHL(1, 31) - 1, SUM(amount), 2 AS LTYPE
    FROM ledger
) a
ORDER BY ledger_account, LTYPE

С Firebird 3 вы также можете попробовать другой подход, используя оконные функции.Это решение не будет создавать дополнительные строки для промежуточных итогов и итогов, но будет производить их встроенными.Тогда ваш уровень презентации может быть обязан правильно их показывать:

SELECT ledger_account, 
 amount, 
 SUM(amount) OVER(PARTITION BY ledger_account) AS subtotal, 
 SUM(amount) OVER() AS total
FROM ledger
ORDER BY ledger_account
...