MYSQL 使用列值更新列
MYSQL Update column with column value
需要更新包含值的 3 列的列平均值。这意味着不应将没有值或 0 的列包含在平均值中。请帮忙。这有点棘手。
grade_tbl
+-- prelim_g --- semi_g --- finals_g --- average_g --+
| 85 80 85 |
| 82 87 |
| 83 84 |
| 81 |
+----------------------------------------------------+
到目前为止我有这个代码:
UPDATE grade_tbl SET average = (SELECT AVG(prelim, semi, finals))
我们可以尝试以下逻辑,它将零分配给缺失值(尚未为零),并通过“计算”仅非 NULL
/非零等级值来确定平均值。
UPDATE grade_tbl
SET
average = CASE WHEN (prelim_g + semi_g + finals_g) > 0
THEN (prelim_g + semi_g + finals_g) /
( IF(prelim_g > 0, 1, 0) +
IF(semi_g > 0, 1, 0) +
IF(finals_g > 0, 1, 0) )
ELSE 0 END;
顺便说一句,更好的数据库设计是将所有成绩都放在一个列中。然后,您可以利用 AVG
和 COUNT
函数,它们默认忽略 NULL
值。
需要更新包含值的 3 列的列平均值。这意味着不应将没有值或 0 的列包含在平均值中。请帮忙。这有点棘手。
grade_tbl
+-- prelim_g --- semi_g --- finals_g --- average_g --+
| 85 80 85 |
| 82 87 |
| 83 84 |
| 81 |
+----------------------------------------------------+
到目前为止我有这个代码:
UPDATE grade_tbl SET average = (SELECT AVG(prelim, semi, finals))
我们可以尝试以下逻辑,它将零分配给缺失值(尚未为零),并通过“计算”仅非 NULL
/非零等级值来确定平均值。
UPDATE grade_tbl
SET
average = CASE WHEN (prelim_g + semi_g + finals_g) > 0
THEN (prelim_g + semi_g + finals_g) /
( IF(prelim_g > 0, 1, 0) +
IF(semi_g > 0, 1, 0) +
IF(finals_g > 0, 1, 0) )
ELSE 0 END;
顺便说一句,更好的数据库设计是将所有成绩都放在一个列中。然后,您可以利用 AVG
和 COUNT
函数,它们默认忽略 NULL
值。