1

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

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

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

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

我能够计算每个测试的平均值,但对找出每个用户的平均值感到困惑。

有没有办法做到这一点??

请帮忙。

马赫什

4

3 回答 3

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
于 2010-09-09T16:27:18.447 回答
1

The simple answer is to UNPIVOT the same way you just PIVOTed. But the best answer is to not do the PIVOT in the first place! Store the unpivoted data in a table first, then from that do your PIVOT and your average.

于 2010-09-10T04:35:31.340 回答
1

您可以在数据源上执行它,然后再对其进行透视吗?

于 2010-09-09T16:28:13.313 回答