我的表格如下所示。 我正在为总桌做平均值。我得到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。
我怎么能过来这个?
我的数学不正确吗?
可以给我一些简短的解释。
提前致谢。
答案 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)
问题是您减少了计算的两个步骤中的信息。你的原作是一个简单的平均值。
减少后,你得到了:
你遇到的问题是每个值的权重是不同的。您有两个影响A
的值,两个值影响B
,但只有一个值影响C
。这些信息虽然对计算平均值很重要,但却丢失了。另外你需要做的是获得适当的平均值,即存储每个平均值的重量。表示源值的数量。这将是:
Student Value Weight
A 10 2
B 15 2
C 20 1
权重只是每个学生的价值计数。您可以在一个查询中轻松提取它。
现在,您的最终平均值应如下所示:
选择您需要的值应该如下所示:
SELECT Student, AVG(CAST(Score as float)) AvgScore, COUNT(*) Weight
FROM @Table
GROUP BY Grouping sets(Student,())
路径的其余部分应该清楚。乘以权重和平均值,并将其除以权重值之和。