|
Ранее в главе 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(<expression to generate available balance>), SUM(<expression to generate pending balance>)
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, позволяя суммиро_ вать соответствующие денежные объемы.
Дата добавления: 2015-08-17; просмотров: 36 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Gt; FROM account | | | Проверка существования |