我们在进行数据统计的时候, 经常会遇到求百分比, 环比, 同比等这些需要除以某个数的情况, 而如果除数为 0, 数据库是会报错的.
问题
我们在进行数据统计的时候, 经常会遇到求百分比, 环比, 同比等这些需要除以某个数的情况, 而如果除数为 0, 数据库是会报错的.
那么遇到这样的情况我们怎么处理呢? 下面我们用示例给大家讲解一下处理方法.
解决办法
情况一
例如
SELECT A/B FROM TAB
遇到这样的情况, 一般的处理方法是用 CASE WHEN 来判断 B 的值
- SELECT
- CASE WHEN B=0 THEN 0 ELSE A/B END
- FROM TAB
这样当 B 如果是 0, 我们直接赋一个值, 避免 A/B 参与计算报错.
情况二
上面是一种常见的情况, 但是如果遇到下面这样的聚合函数呢?
例如
SELECT SUM(A)/COUNT(B) FROM TAB
遇到这样的情况 CASE WHEN 是不能判断 COUNT(B)的值的, 因为 WHEN 后面的条件不能使用聚合函数(语法要求), 这个时候我们可以这样处理
- SELECT
- ISNULL(SUM(A)/NULLIF(COUNT(B),0),0)
- FROM TAB
其中这里使用了两个函数, NULLIF()和 ISNULL()
NULLIF 函数有两个参数, 定义如下:
NULLIF( expression1 , expression2 )
其作用就是: 如果两个指定的表达式相等, 就返回 NULL 值.
ISNULL 函数也有两个参数, 定义如下:
ISNULL( expression1 , expression2 )
其作用是: 如果第一个参数的结果为 NULL, 就返回第二个参数的值.
当 COUNT(B)的结果为 0 时, 恰好与第二个给定的参数 0 相等, 这个时候 NULLIF 函数就会返回 NULL, 而 SUM(A)在除以 NULL 时结果为 NULL, 外层使用 ISNULL 函数再对 NULL 值进行判断, 这样最终结果就是 0 了.
这两种方法就是我们日常处理除数为 0 的情况了, 一定要记得哦~
来源: http://database.51cto.com/art/202108/678340.htm