我有以下查询来检索和计算2个给定期间的销售额,实际增长率和指数增长率。 p>
参考索引增长为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
答案 0 :(得分:2)
在整个表达式上使用coalesce
:
coalesce( <expression>, 0)
答案 1 :(得分:2)
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
的使用是多余的。