Читайте также:
|
|
В некоторых случаях требуется установить существование связи меж_ ду двумя сущностями, не касаясь количественных показателей. На_ пример, нужно узнать, есть ли у клиента текущие или сберегательные счета, не интересуясь тем, сколько у него счетов каждого типа. Вот за_ прос с несколькими выражениями case, формирующими два столбца выходных данных. Первый показывает, есть ли у клиента текущие счета, а второй – есть ли сберегательные счета:
mysql> | SELECT c.cust_id, c.fed_id, c.cust_type_cd, |
_> | CASE |
_> | WHEN EXISTS (SELECT 1 FROM account a |
_> | WHERE a.cust_id = c.cust_id |
_> | AND a.product_cd = 'CHK') THEN 'Y' |
_> | ELSE 'N' |
_> | END has_checking, |
_> | CASE |
_> | WHEN EXISTS (SELECT 1 FROM account a |
_> | WHERE a.cust_id = c.cust_id |
_> | AND a.product_cd = 'SAV') THEN 'Y' |
_> | ELSE 'N' |
_> | END has_savings |
_> | FROM customer c; |
+_________+_____________+______________+______________+_____________+ | cust_id | fed_id | cust_type_cd | has_checking | has_savings | +_________+_____________+______________+______________+_____________+
| | | | 111_11_1111 | | | I | | | Y | | | Y | | | |
| | | | 222_22_2222 | | | I | | | Y | | | Y | | |
Примеры выражений case | ||||||
| | | 333_33_3333 | I | | Y | | N | | | ||
| | | 444_44_4444 | I | | Y | | Y | | | ||
| | | 555_55_5555 | I | | Y | | N | | | ||
| | | 666_66_6666 | I | | Y | | N | | | ||
| | | 777_77_7777 | I | | N | | N | | | ||
| | | 888_88_8888 | I | | Y | | Y | | | ||
| | | 999_99_9999 | I | | Y | | N | | | ||
| | | 04_1111111 | | B | | Y | | N | | | |
| | | 04_2222222 | | B | | N | | N | | | |
| | | 04_3333333 | | B | | Y | | N | | | |
| | | 04_4444444 | | B | | N | | N | | |
+_________+_____________+______________+______________+_____________+ 13 rows in set (0.00 sec)
Каждое выражение case включает связанный подзапрос к таблице ac_ count: один для поиска текущих счетов, другой – сберегательных сче_ тов. Поскольку каждый блок when использует оператор exists, условия выполняются, если у клиента есть, по крайней мере, один счет иско_ мого типа.
В других случаях нас может интересовать количество встретившихся строк, но лишь постольку поскольку. Например, следующий запрос с помощью простого выражения case подсчитывает количество счетов каждого клиента, а затем возвращает 'None', '1', '2' или '3+':
mysql> SELECT c.cust_id, c.fed_id, c.cust_type_cd, | ||
_> CASE (SELECT COUNT(*) FROM account a | ||
_> | WHERE a.cust_id = c.cust_id) | |
_> | WHEN 0 | THEN 'None' |
_> | WHEN 1 | THEN '1' |
_> | WHEN 2 | THEN '2' |
_> | ELSE '3+' | |
_> | END num_accounts |
_> FROM customer c;
+_________+_____________+______________+______________+ | cust_id | fed_id | cust_type_cd | num_accounts | +_________+_____________+______________+______________+
| | | 111_11_1111 | | I | | 3+ | | | |
| | | 222_22_2222 | | I | | 2 | | | |
| | | 333_33_3333 | | I | | 2 | | | |
| | | 444_44_4444 | | I | | 3+ | | | |
| | | 555_55_5555 | | I | | 1 | | | |
| | | 666_66_6666 | | I | | 2 | | | |
| | | 777_77_7777 | | I | | 1 | | | |
| | | 888_88_8888 | | I | | 2 | | | |
| | | 999_99_9999 | | I | | 3+ | | | |
| | | 04_1111111 | | B | | 2 | | | |
| | | 04_2222222 | | B | | 1 | | | |
| | | 04_3333333 | | B | | 1 | | | |
| | | 04_4444444 | | B | | 1 | | |
+_________+_____________+______________+______________+ 13 rows in set (0.01 sec)
226 Глава 11. Условная логика
В этом запросе я не хотел проводить различия между клиентами, име_ ющими более двух счетов, поэтому выражение case просто создает ка_ тегорию '3+'. Подобный запрос может быть полезным при поиске кли_ ентов, с которыми можно связаться и предложить открыть новый счет в банке.
Дата добавления: 2015-08-17; просмотров: 33 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Селективная агрегация | | | Ошибки деления на нуль |