SQL除法返回NULL值而不是Numeric

时间:2016-10-27 14:50:14

标签: mysql sql null sum average

我希望从下面的数据集中计算每日收入。如果为0表示资产未产生收入,则不应计入每日收入计算。我没有检索每日数字收入,而是返回NULL值。以下是我的代码和数据集。

    **asset_revenue**
          15
          15
          213
          0
          32
          89
          -47

          SUM([asset_revenue]) / SUM(CASE WHEN asset_revenue <> 0 THEN 7 ELSE NULL END)

在上面的示例中,我预计每日收入为7.54。 SQL有没有返回NULL值的原因?

3 个答案:

答案 0 :(得分:0)

看起来你正试图获得平均值。

只需使用0代替NULL。这将导致您的分母等于具有非零asset_revenue的行数。

如果行代表每日收入:

SELECT SUM([asset_revenue]) / 
    CASE
        WHEN SUM([asset_revenue]) <> 0 THEN SUM(CASE WHEN asset_revenue <> 0 THEN 1 ELSE 0 END)
        ELSE 1 -- Special case where asset_revenue is zero across the entire time period. 0/1 is still zero, so that represents an average revenue of zero.
    END

如果行代表每周收入,或者由于其他原因需要保留7,请执行以下操作:

SELECT SUM([asset_revenue]) /
    CASE
        WHEN SUM([asset_revenue]) <> 0 THEN SUM(CASE WHEN asset_revenue <> 0 THEN 7 ELSE 0 END)
        ELSE 1 -- Special case where asset_revenue is zero across the entire time period. 0/1 is still zero, so that represents an average revenue of zero.
    END

@Strawberry对于原因是正确的,您的脚本会返回NULLNULL表示您不知道的值是什么。如果您不知道某个值是什么,则无法知道将该未知值放入算术运算并且请求结果时会发生什么。什么是55加上一些未知值?我不知道!

答案 1 :(得分:0)

原因:

SELECT 1 + NULL;
+----------+
| 1 + NULL |
+----------+
|     NULL |
+----------+
1 row in set (0.00 sec)

答案 2 :(得分:0)

在某些情况下,COALESCE函数很方便:

mysql> SELECT COALESCE(123, 1), COALESCE(NULL, 1);
+------------------+-------------------+
| COALESCE(123, 1) | COALESCE(NULL, 1) |
+------------------+-------------------+
|              123 |                 1 |
+------------------+-------------------+
1 row in set (0.00 sec)

更具体地说:

SUM(asset_revenue) /
   COALESCE(SUM(CASE WHEN asset_revenue <> 0 THEN 7 ELSE NULL END), 0)

或者也许

COALESCE( SUM(asset_revenue) /
          SUM(CASE WHEN asset_revenue <> 0 THEN 7 ELSE NULL END)
         1)

为简洁起见:

SUM(CASE WHEN asset_revenue <> 0 THEN 7 ELSE NULL END)

->

7 * SUM(asset_revenue <> 0)

(除了可以产生0而不是NULL)