我希望从下面的数据集中计算每日收入。如果为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值的原因?
答案 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对于原因是正确的,您的脚本会返回NULL
。 NULL
表示您不知道的值是什么。如果您不知道某个值是什么,则无法知道将该未知值放入算术运算并且请求结果时会发生什么。什么是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)