您可以为每个用户添加标记,然后除以列数:
SELECT
user,
(test1 + test2 + test3) / 3 AS average_mark
FROM users
或者忽略 NULL 值:
SELECT
user,
(ISNULL(test1, 0) + ISNULL(test2, 0) + ISNULL(test3, 0)) / (
CASE WHEN test1 IS NULL THEN 0 ELSE 1 END +
CASE WHEN test2 IS NULL THEN 0 ELSE 1 END +
CASE WHEN test3 IS NULL THEN 0 ELSE 1 END
) AS average_mark
FROM users
您的表结构有两个缺点:
- 因为您的表结构是动态创建的,所以您还必须动态构建此查询。
- 因为有些学生不会参加所有测试,所以可能会有一些 NULL 值。
您可能需要考虑更改表结构来解决这两个问题。我建议您对表使用以下结构:
user test mark
-------------------
A1 1 10
A2 1 90
A3 1 78
A1 2 20
A2 2 87
A3 2 12
A1 3 30
A2 3 75
A3 3 34
然后你可以这样做以获得每个用户的平均分数:
SELECT user, AVG(mark) AS average_mark
FROM users
GROUP BY user
这是为了获得每次测试的平均分数:
SELECT test, AVG(mark) AS average_mark
FROM users
GROUP BY test