找到给定结果集的平均值

时间:2015-09-03 11:24:56

标签: sql-server sql-server-2008

我的表格如下所示。 我正在为总桌做平均值。我得到14.很好。

declare @Table table (Student Varchar(10), Score int)
    insert into @Table
    select 'A',10
    union all
    select 'B',20
    union all
    select 'A',10
    union all
    select 'C',20
    union all
    select 'B',10

select avg(cast(Score as float)) AvgScore from @Table

 AvgScore
 --------
  14

select Student, avg(cast(Score as float)) AvgScore from @Table group by Grouping sets(Student,())
    Student AvgScore
   ------------------
    A   10
    B   15
    C   20
NULL    14

如果我做平均值(10 + 15 + 20)/ 3,我不会得到14。 我怎么能过来这个?
我的数学不正确吗?
可以给我一些简短的解释。

提前致谢。

2 个答案:

答案 0 :(得分:0)

所有数据的总平均值如此:

(10 + 20 + 10 + 20 + 10) / 5 = 70 / 5 = 14

一切都好。您尝试计算平均值(10+15+20)/3,这从数学角度来看是无意义的。

看看这个例子:

A - 1
A - 1
A - 1
A - 1
B - 20

平均值为(1+1+1+1+20) / 5 (1+20)/2

答案 1 :(得分:0)

问题是您减少了计算的两个步骤中的信息。你的原作是一个简单的平均值。

(10 + 20 + 10 + 20 + 10) / 5 = 70 / 5 = 14

减少后,你得到了:

(10 + 15 + 20) / 3 = 45 / 3 = 15

你遇到的问题是每个值的权重是不同的。您有两个影响A的值,两个值影响B,但只有一个值影响C。这些信息虽然对计算平均值很重要,但却丢失了。另外你需要做的是获得适当的平均值,即存储每个平均值的重量。表示源值的数量。这将是:

Student    Value    Weight
      A       10         2
      B       15         2
      C       20         1

权重只是每个学生的价值计数。您可以在一个查询中轻松提取它。

现在,您的最终平均值应如下所示:

((10 * 2) + (15 * 2) + (20 * 1)) / (2 + 2 + 1) = 70 / 5 = 14

选择您需要的值应该如下所示:

SELECT Student, AVG(CAST(Score as float)) AvgScore, COUNT(*) Weight
FROM @Table
GROUP BY Grouping sets(Student,())

路径的其余部分应该清楚。乘以权重和平均值,并将其除以权重值之和。