В 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