Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Упражнения | Внешние соединения | Сравнение левосторонних и правосторонних внешних соединений | Трехсторонние внешние соединения | Рекурсивные внешние соединения | Перекрестные соединения | Естественные соединения | Что такое условная логика? | Выражение case | Простые выражения case |


 

Ранее в главе 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| Проверка существования

mybiblioteka.su - 2015-2024 год. (0.007 сек.)