2010-12-02 15 views
4

皆さん、私はさまざまなアクティビティタイプ(宿題、クイズなど)のグレードを取得するSQLステートメントを持っています。そのタイプのドロップが最も低い場合、それは残っています。エラーはSQLコードと同様に下にあります。あなたがドロップする必要がある場合にのみ(ネクタイの場合)1つの、最低グレード平均値の合計マイナス最小値

SELECT student_id, AVG(grade) 
FROM (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY grade) rn 
     FROM my_tables 
     ) 
WHERE NOT (drop_hw = 1 AND rn = 1) 
GROUP BY 
     student_id 

をドロップする必要がある場合は

- Cannot perform an aggregate function on an expression containing an aggregate or a subquery. 
- Column 'Policy.drop_hw' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

答えて

3

分析機能を調べます。 (SO question,Oracle documentation)。このような

何か:

AVG(Grades.grade) OVER (PARTITION BY Grades.student_id) AS avg_of_grades 

と:

(AVG(SUM(Grades.grade) - MIN(Grades.grade))) OVER (PARTITION BY Grades.student_id) AS avg_grades_with_drop 

設定し、あなたのケースで理にかなっているものは何でもしてパーティショニング。あなたの例ではFROM ...が省略されているので、わからない。

CASEステートメント内の任意の計算で、これらの列エイリアスを使用できます。

+0

ありがとうございます。 – OneSneakyMofo

1

を:ここで

SELECT  Student.firstName, Student.lastName, 'Grades' = 
      CASE 
       WHEN Grades.activityType = 'Homework' THEN 
       CASE WHEN Policy.drop_hw = 1 THEN 
        (AVG(SUM(Grades.grade) - MIN(Grades.grade))) * (Policy.homework/100) 
       ELSE 
        (AVG(Grades.grade) * (Policy.homework/100)) 
       END 
      END, Course.courseNum, Course.sectNum, Grades.activityType 

FROM ... 

は私が取得していますエラーですすべての最低成績:

0

su m演算子は1つの結果を(グループごとに)与えます。ミニオペレータも。では、avg-operatorはどのように集計すべきでしょうか?

+0

これは良い点です。私はそれについて考えなかった。総数がない場合は、合計と平均を平均するにはどうすればよいですか? – OneSneakyMofo

+0

何をしたいですか?私はあなたが計算したいものを理解していません。 SUM-MINの感覚は何ですか? –

+0

さて、これらの成績は(100,100,100,90)としましょう。クラスが最も低い落ち込みを持っていれば、sum-min ttを使って390から90を得ると、その数の平均を見つけることができますが、それは数を数えられないのでできませんあるものと別のものがあなたのように言った。 – OneSneakyMofo

関連する問題