Читайте также:
|
|
Проводя вычисления, включающие деление, нужно все время забо_ титься о том, чтобы знаменатель никогда не был равен нулю. Некото_ рые серверы БД, такие как Oracle Database, встретив нулевой знамена_ тель, формируют ошибку, а MySQL просто присваивает результату вы_ числения значение null, как показывает следующий пример:
mysql> SELECT 100 / 0;
+_________+ | 100 / 0 | +_________+ | NULL | +_________+
1 row in set (0.00 sec)
Чтобы защитить вычисления от ошибок или, еще хуже, от загадочного получения null, следует ко всем знаменателям применять условную логику, как показано далее:
mysql> SELECT a.cust_id, a.product_cd, a.avail_balance /
_> | CASE | |||||
_> | WHEN | prod_tots.tot_balance = 0 | THEN 1 | |||
_> | ELSE | prod_tots.tot_balance | ||||
_> | END percent_of_total | |||||
_> FROM account a INNER JOIN | ||||||
_> | (SELECT | a.product_cd, SUM(a.avail_balance) tot_balance | ||||
_> | FROM account a | |||||
_> | GROUP BY a.product_cd) prod_tots | |||||
_> | ON | a.product_cd = prod_tots.product_cd; | ||||
+_________+____________+__________________+ | ||||||
| cust_id | | product_cd | percent_of_total | | |||||
+_________+____________+__________________+ | ||||||
| | | | BUS | | | 0.0000 | | | |
| | | | BUS | | | 1.0000 | | | |
| | | | CD | | | 0.1538 | | | |
| | | | CD | | | 0.5128 | | | |
| | | | CD | | | 0.2564 | | | |
| | | | CD | | | 0.0769 | | | |
| | | | CHK | | | 0.0145 | | | |
| | | | CHK | | | 0.0309 | | | |
| | | | CHK | | | 0.0145 | | | |
| | | | CHK | | | 0.0073 | | | |
| | | | CHK | | | 0.0307 | | | |
| | | | CHK | | | 0.0017 | | |
Примеры выражений case | ||||||
| | | | CHK | | | 0.0478 | | | |
| | | | CHK | | | 0.0017 | | | |
| | | | CHK | | | 0.3229 | | | |
| | | | CHK | | | 0.5281 | | | |
| | | | MM | | | 0.1298 | | | |
| | | | MM | | | 0.3219 | | | |
| | | | MM | | | 0.5483 | | | |
| | | | SAV | | | 0.2694 | | | |
| | | | SAV | | | 0.1078 | | | |
| | | | SAV | | | 0.4137 | | | |
| | | | SAV | | | 0.2091 | | | |
| | | | SBL | | | 1.0000 | | |
+_________+____________+__________________+ 24 rows in set (0.00 sec)
Этот запрос вычисляет отношение остатка на счете к общему остатку для всех счетов одного типа. Поскольку для некоторых типов счетов, таких как ссуды коммерческим предприятиям, общий остаток может равняться нулю, если на текущий момент все ссуды полностью выпла_ чены, лучше всего включить выражение case, гарантирующее, что знаменатель никогда не будет равен нулю.
Дата добавления: 2015-08-17; просмотров: 41 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Проверка существования | | | Условные обновления |