Мне нужно видеть промежуточный итог в моем поле AMOUNT каждый раз, когда происходит изменение в поле LEDGER_ACCOUNT.
Я провел много исследований по этому вопросу, и оказалось, что это работа для профсоюза. Но я не могу заставить союз добавлять общую сумму каждый раз, когда происходит изменение
Мой текущий запрос выбора выглядит следующим образом:
ВЫБРАТЬ L.LEDGER_ACCOUNT, CURRROUND(L.DEBIT,2) - CURRROUND(L.CREDIT,2) КАК СУММА ОТ ЛЕГЕР Л
На данный момент он показывает следующие поля:
Но мне нужно следующее возвращение:
Я использую Firebird 2.5.7.
Пожалуйста, редактировать ваш вопрос с дополнительной информацией, не оставляйте это в комментариях. Было бы полезно, если бы вы предоставили примеры данных и ожидаемые результаты, потому что сейчас мне не совсем понятно, чего вы хотите. Также укажите версию Firebird, которую вы используете.
Спасибо за ваш отзыв! Я внес изменения, как было предложено.
это также может быть работой для stored procedure


Желаемый результат может быть достигнут в 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
Спасибо, сэр. Это сработало отлично. Теперь мне нужно начать играть с добавлением дополнительных полей. Спасибо.
Чтобы упростить мой вопрос, рассмотрите следующий запрос: ВЫБЕРИТЕ L.LEDGER_ACCOUNT, CURRROUND(L.DEBIT,2) - CURRROUND(L.CREDIT,2) AS AMOUNT FROM LEDGER L Итак, в основном мне нужен промежуточный итог в поле AMOUNT каждые время изменения в поле L.LEDGER_ACCOUNT. Я буду использовать оператор ORDER BY для сортировки по L.LEDGER_ACCOUNT.