2012-03-02 50 views
1

我有一列中保存的一门课程的等级和另一列保存当然比一个表,然后我想计算的课程平均有比我写的这些代码,但我面对错误,请帮助我AVG上多列

select SUM((grade * ratio)/SUM(ratio)) as averageOfCourses 
from myTable 
+0

什么是错误.............. – 2012-03-02 06:53:35

回答

1

您的问题可能是错位的括号。

SELECT SUM(grade * ratio)/SUM(ratio) AS averageOfCourses 
    FROM myTable 

如果你真的想要做的总和除以值的总和,那么你有一个工作的好成交困难;你不能直接做聚合的聚合。

要做到你写的,你必须把它改写为:

SELECT SUM((grade * ratio)/sum_ratio) AS averageOfCourses 
    FROM (SELECT grade, ratio, SUM(ratio) AS sum_ratio 
      FROM myTable 
     GROUP BY grade, ratio) AS precalculation 

(最终AS通过标准SQL要求,但并没有此查询任何贡献)

在这种情况下,我甚至不确定它会给出不同的答案。

+0

是的,这是...什么有趣的问题?非常感谢,我在此考虑了30分钟:D – Ehsan 2012-03-02 06:58:16

2

尝试

select (SUM(grade * ratio)/SUM(ratio)) as averageOfCourses from myTable 
1
declare @sum float = (select sum(ratio) from myTable) 
select sum(grade * ratio/@sum) as averageOfCourses from myTable 
+1

这很有效,但双重操作实际上并不必要,甚至可能比单一语句效率稍差。 – 2012-03-02 07:13:03

+0

我刚刚运行了所有查询以查看执行计划和结果。 SELECT SUM(grade * ratio)/ SUM(ratio)给出与我的查询相同的结果和执行计划。您的替代查询会提供不同的结果,并且需要4倍的时间才能执行。 – Phil 2012-03-02 07:25:35