Добавление промежуточного итога в столбец в SQL-запросе Firebird

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

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

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

ВЫБРАТЬ L.LEDGER_ACCOUNT, CURRROUND(L.DEBIT,2) - CURRROUND(L.CREDIT,2) КАК СУММА ОТ ЛЕГЕР Л

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

Добавление промежуточного итога в столбец в SQL-запросе Firebird

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

Добавление промежуточного итога в столбец в SQL-запросе Firebird

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

Чтобы упростить мой вопрос, рассмотрите следующий запрос: ВЫБЕРИТЕ 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.

gdekoker 27.04.2019 18:29

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

Mark Rotteveel 27.04.2019 19:25

Спасибо за ваш отзыв! Я внес изменения, как было предложено.

gdekoker 27.04.2019 20:50

это также может быть работой для stored procedure

Arioch 'The 29.04.2019 12:04
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
272
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Желаемый результат может быть достигнут в 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

Спасибо, сэр. Это сработало отлично. Теперь мне нужно начать играть с добавлением дополнительных полей. Спасибо.

gdekoker 28.04.2019 16:13

Другие вопросы по теме