【问题标题】:MySQL Workbench, average of NULL is returning "0", I need it to return NULLMySQL Workbench,NULL 的平均值返回“0”,我需要它返回 NULL
【发布时间】:2019-09-26 13:38:59
【问题描述】:

我正在尝试平均我的情节级别数据。当我在绘图级别上执行查询时,它会导致与某些行名关联的所有行都为“NULL”。当我执行相同的查询尝试按行名对特征和分组进行 AVG 时,结果显示“0”。我需要它显示“NULL”,这样它就不会影响我的平均值。

选择绘图级数据的示例代码:

SELECT experiment_name, `year`, location_name, line_name, head_dap, height_cm, yield_bua
FROM data_amba
WHERE experiment_name = 'matspr' AND `year` = 2018 AND location_name = 'Stephen'
GROUP BY line_name, head_dap, height_cm, yield_bua;

结果:

+------------+----------+-----------+-----------+
| line_name  | head_dap | height_cm | yield_bua |
+------------+----------+-----------+-----------+
| ND_GENESIS | NULL     | NULL      | 130.9     |
+------------+----------+-----------+-----------+
| ND_GENESIS | NULL     | NULL      | 131.3     |
+------------+----------+-----------+-----------+
| ND_GENESIS | NULL     | NULL      | 134.3     |
+------------+----------+-----------+-----------+
| PINNACLE   | NULL     | NULL      | 144.9     |
+------------+----------+-----------+-----------+
| PINNACLE   | NULL     | NULL      | 146.6     |
+------------+----------+-----------+-----------+
| PINNACLE   | NULL     | NULL      | 163.9     |
+------------+----------+-----------+-----------+
| S2M177     | NULL     | NULL      | 107.6     |
+------------+----------+-----------+-----------+
| S2M177     | NULL     | NULL      | 142.6     |
+------------+----------+-----------+-----------+
| S2M177     | NULL     | NULL      | 168.6     |
+------------+----------+-----------+-----------+
| S2M178     | NULL     | NULL      | 114.6     |
+------------+----------+-----------+-----------+
| S2M178     | NULL     | NULL      | 132.9     |
+------------+----------+-----------+-----------+
| S2M178     | NULL     | NULL      | 154.6     |
+------------+----------+-----------+-----------+
| S2M179     | NULL     | NULL      | 132.6     |
+------------+----------+-----------+-----------+
| S2M179     | NULL     | NULL      | 137.9     |
+------------+----------+-----------+-----------+
| S2M179     | NULL     | NULL      | 140.6     |
+------------+----------+-----------+-----------+
| S2M180     | NULL     | NULL      | 101.9     |
+------------+----------+-----------+-----------+
| S2M180     | NULL     | NULL      | 147.3     |
+------------+----------+-----------+-----------+
| S2M180     | NULL     | NULL      | 169.6     |
+------------+----------+-----------+-----------+
| S2M181     | NULL     | NULL      | 111.9     |
+------------+----------+-----------+-----------+
| S2M181     | NULL     | NULL      | 125.3     |
+------------+----------+-----------+-----------+
| S2M181     | NULL     | NULL      | 138.9     |
+------------+----------+-----------+-----------+

选择平均值的示例代码:

SELECT experiment_name, `year`, location_name, line_name, AVG(head_dap), AVG(height_cm), AVG(yield_bua)
FROM data_amba
WHERE experiment_name = 'matspr' AND `year` = 2018 AND location_name = 'Stephen'
GROUP BY line_name;

结果:

+------------+---------------+----------------+----------------+
| line_name  | AVG(head_dap) | AVG(height_cm) | AVG(yield_bua) |
+------------+---------------+----------------+----------------+
| ND_GENESIS | 0             | 0              | 132.1667       |
+------------+---------------+----------------+----------------+
| PINNACLE   | 0             | 0              | 151.8          |
+------------+---------------+----------------+----------------+
| S2M177     | 0             | 0              | 139.6          |
+------------+---------------+----------------+----------------+
| S2M178     | 0             | 0              | 134.0333       |
+------------+---------------+----------------+----------------+
| S2M179     | 0             | 0              | 137.0333       |
+------------+---------------+----------------+----------------+
| S2M180     | 0             | 0              | 139.6          |
+------------+---------------+----------------+----------------+
| S2M181     | 0             | 0              | 125.3667       |
+------------+---------------+----------------+----------------+

当平均 3 个“NULL”值时,我希望在结果中看到“NULL”而不是“0”,因此它不会影响我在下游执行的任何大均值计算。

【问题讨论】:

  • 您是否尝试过其他客户端?你得到相同的结果吗?
  • MySQL 中的 AVG 预计只会平均非 NULL,所以除非你有一个零,否则你应该永远在你的场景中得到 0。如果 唯一 您期望 NULL 的情况是当您拥有所有 NULL 时 - 这意味着您只期望平均 严格正数 数字 - 然后使用 NULLIF(AVG(), 0)。否则,您将不得不使用 SUM(IF(...))/COUNT(IF(...)) 构建复杂的解决方法并管理可能会发现自己被 0 除的极端情况。

标签: mysql mysql-workbench sql-null


【解决方案1】:

我能想到的最简单的解决方法是使用 NULLIF 函数 -

SELECT experiment_name
      ,`year`
      ,location_name
      ,line_name
      ,NULLIF(AVG(head_dap), 0)
      ,NULLIF(AVG(height_cm), 0)
      ,NULLIF(AVG(yield_bua), 0)
FROM data_amba
WHERE experiment_name = 'matspr'
AND `year` = 2018
AND location_name = 'Stephen'
GROUP BY line_name;

【讨论】:

    【解决方案2】:

    这可能是 MySQL WorkBench 的 behavior 为整数字段显示零。当我在 SqlFiddle 中运行相同时,它显示 null 以防 所有行都为空属于该类别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-07
      • 2012-06-15
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多