MySQL - 在除以零时避免使用NULL

时间:2016-03-02 12:48:30

标签: php mysql sql

我有以下查询来检索和计算2个给定期间的销售额,实际增长率和指数增长率。

参考索引增长为sales growth % + 100。因此,如果项目增长 8%,它的索引将为108,就好像缩小 8%,索引将是92.

当第一个可比较年度的销售额为0时,问题就出现了,因此实际增长值除以0并返回NULL以添加到100。

如何阻止查询在除以零时返回NULL,并让它返回0?

这是PHP应用程序的一部分,因此,如果在应用程序层中更好地处理解决方案,请在任何答案中进行相应的建议。

SELECT 
    product,
    SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END) AS `period1`,
    SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) AS `period2`,
    SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) - SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END) AS `growth`,
    (((SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) - SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END)) / 
    (SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END))) * 100) + 100 AS `index`
FROM
    productlevel_data AS a
WHERE
    `group` = 'Confectionery'
        AND class = 'Confectionery'
        AND category = 'Confectionery'
        AND subcategory = 'Seasonal'
        AND brand = 'brand'
        AND destination LIKE '%'
GROUP BY product

2 个答案:

答案 0 :(得分:2)

在整个表达式上使用coalesce

coalesce( <expression>, 0)

答案 1 :(得分:2)

您可以使用NULLIFCOALESCE

COALESCE(
(((SUM(CASE WHEN yr = 2014 THEN sales ELSE 0 END) 
  - 
 SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END)) 
  / 
 NULLIF((SUM(CASE WHEN yr = 2013 THEN sales ELSE 0 END))) * 100),0) + 100, 0) AS `index`

使用NULLIF有助于避免除以零错误:如果分母为0,则整个表达式的计算结果为NULL。使用的COALESCE会将此NULL值转换为预期的0

注意:事实证明,不像其他RDBMS(如SQL Server),MySQL 不会抛出错误以防除零发生,,但返回NULL。因此,在这种情况下,NULLIF的使用是多余的。