Селективная агрегация

Ранее в главе 9 было показано частичное решение задачи поиска сче_ тов, остаток на которых не соответствует данным таблицы transaction. Причиной предоставления частичного решения была необходимость применения условной логики, но теперь у нас есть все для того, чтобы закончить работу. Вот на чем я остановился в главе 9:


Примеры выражений case

SELECT CONCAT('ALERT! : Account #', a.account_id, ' Has Incorrect Balance!')

FROM account a

WHERE (a.avail_balance, a.pending_balance)

(SELECT SUM(), SUM()

FROM transaction t

WHERE t.account_id = a.account_id);

Для суммирования отдельных транзакций по данному счету этот за_ прос использует связанный подзапрос к таблице transaction. При сум_ мировании Селективная агрегация транзакций следует учитывать два факта:

• Суммы транзакций всегда положительны, поэтому чтобы понять, является ли транзакция дебетовой или кредитовой, необходимо по_ смотреть на ее тип и изменить знак (умножить на –1) для дебетовых транзакций.

• Если дата в столбце funds_avail_date больше текущей, транзакция должна быть добавлена в суммарный отложенный остаток, а не в суммарный доступный остаток.

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

CASE

WHEN transaction.txn_type_cd = 'DBT'

THEN transaction.amount * _1

ELSE transaction.amount

END

Таким образом Селективная агрегация, все суммы транзакций для дебетовых транзакций ум_ ножаются на –1, а для кредитовых транзакций остаются неизменны_ ми. Точно такая же логика применяется и к вычислению доступного остатка, но здесь должны быть включены только те транзакции, кото_ рые стали доступными. Поэтому выражение case для вычисления дос_ тупного остатка включает один дополнительный блок when:

CASE

WHEN transaction.funds_avail_date > CURRENT_TIMESTAMP()

THEN 0

WHEN transaction.txn_type_cd = 'DBT'

THEN transaction.amount * _1

ELSE transaction.amount

END

В первом блоке when недоступные фонды, такие как неоплаченные че_ ки, будут добавлять к сумме 0 долларов. Вот окончательный вариант запроса с двумя выражениями case:

SELECT CONCAT('ALERT! : Account #', a.account Селективная агрегация_id, ' Has Incorrect Balance!')


224 Глава 11. Условная логика

FROM account a

WHERE (a.avail_balance, a.pending_balance) (SELECT

SUM(CASE

WHEN t.funds_avail_date > CURRENT_TIMESTAMP() THEN 0

WHEN t.txn_type_cd = 'DBT' THEN t.amount * _1

ELSE t.amount END),

SUM(CASE

WHEN t.txn_type_cd = 'DBT' THEN t.amount * _1

ELSE t.amount END)

FROM transaction t

WHERE t.account_id = a.account_id);

С помощью условной логики исходные данные поставляются в агре_ гатные функции sum() двумя выражениями case, позволяя суммиро_ вать соответствующие денежные объемы.


documentavighef.html
documentavigoon.html
documentavigvyv.html
documentavihdjd.html
documentavihktl.html
Документ Селективная агрегация