SQLServer计算多列的平均值

时间:2010-09-09 16:23:28

标签: sql-server average

我使用PIVOT生成了一个表,并且列的输出是动态的。其中一个输出如下:

user       test1   test2    test3 
--------------------------------
A1          10      20       30  
A2          90      87       75
A3          78      12       34

上表的输出表示参加测试的用户列表。测试将动态添加,因此列本质上是动态的。

现在,我想找出每个用户的平均分数以及每个测试的平均分数。

我能够计算每次测试的平均值,但很难找到每个用户的平均值。

有办法吗?

请帮忙。

马赫什

3 个答案:

答案 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

您的表结构有两个缺点:

  • 由于您的表结构是动态创建的,因此您还必须动态构建此查询。
  • 因为有些学生不会参加所有测试,所以你可能会有一些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

答案 1 :(得分:1)

在转动之前,您可以在数据源上执行此操作吗?

答案 2 :(得分:1)

简单的答案是UNPIVOT,就像你刚才那样。但最好的答案是首先不要做PIVOT!首先将不透明的数据存储在表格中,然后从 存储您的PIVOT和平均值。