我使用PIVOT生成了一个表,并且列的输出是动态的。其中一个输出如下:
user test1 test2 test3
--------------------------------
A1 10 20 30
A2 90 87 75
A3 78 12 34
上表的输出表示参加测试的用户列表。测试将动态添加,因此列本质上是动态的。
现在,我想找出每个用户的平均分数以及每个测试的平均分数。
我能够计算每次测试的平均值,但很难找到每个用户的平均值。
有办法吗?
请帮忙。
马赫什
答案 0 :(得分:3)
您可以为每个用户添加标记,然后除以列数:
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
您的表结构有两个缺点:
您可能需要考虑更改表结构以解决这两个问题。我建议您使用以下结构:
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
答案 1 :(得分:1)
在转动之前,您可以在数据源上执行此操作吗?
答案 2 :(得分:1)
简单的答案是UNPIVOT,就像你刚才那样。但最好的答案是首先不要做PIVOT!首先将不透明的数据存储在表格中,然后从 存储您的PIVOT和平均值。