2016-10-04 6 views
1

フィールドStudentID、ClassID、ExamID、SubjectID、およびScoresを持つテーブルを持っています 私はすべての生徒から試行された科目から7つのトップスコアの合計を取得しようとしています。以下のSQL文は、私にトップ7の学生からのすべての対象のスコアの合計を与えている:TOPの述語を選択

SELECT TOP 7 Sum(tblScores.Scores) AS Total, tblScores.AdmissionID 
FROM tblScores 
WHERE (((tblScores.ExamID)=[Forms]![frmReports]![lstC]) AND ((tblScores.ClassID)=[Forms]![frmReports]![lstB])) 
GROUP BY tblScores.AdmissionID 
ORDER BY Sum(tblScores.Scores) DESC; 

クラスと試験の基準はフォーム「frmReports」

から助けることができる任意のものを読まれます私は出る?

+0

あるいは、派生テーブルまたは格納されたクエリを使用する(このクエリで参照される別個のオブジェクトとして抽出テーブルを保存している)とインラインサブクエリを回避することができます。 7人の生徒が最高の理由は何ですか?スコアが結ばれているとどうなりますか? –

+0

私は7人の最高の学生に興味がありません。上記のSQLはそれを解決します。私は7人の被験者(10人または12人のうちの1人)のベストスコアに興味があり、それが私の望む結果になります。私のテーブルには5つのフィールドがあります。これらはAdmissionID、ClassID、ExamID、SubjectID、およびScoresです – Wakwehu

答えて

0

を - ご指導をいただき、ありがとうございます。私は実際には完璧な答えを得るためにあなたのソリューションを微調整しています

SELECT Dupe.AdmissionID、Dupe.Scores、Dupe.ScoreRank (qryFilteredScores.AdmissionID、qryFilteredScores.Scoresを選択、(SELECT COUNT(* FROM:ここではSQLがあります)FROM qryFilteredScores ASサブ
WHERE sub.AdmissionID = qryFilteredScores.AdmissionIDおよびsub.scores> qryFilteredScores.Scores)+ 1 AS ScoreRank FROM qryFilteredScores WHERE(((qryFilteredScores.ExamID)=フォーム!frmReports!lstC)および((qryFilteredScores。 ClassID)= Forms!frmReports!lstB)))AS Dupe WHERE(((Dupe.Scores)<> 0)AND((Dupe.ScoreRank)< = 7));サンプルデータ及び所望の結果を提供してください

SELECT Dupe.AdmissionID, Total.TotalScore 
FROM qryFilteredScores AS Dupe 
INNER JOIN 
    (SELECT sub.AdmissionID, Sum(sub.Scores) As TotalScore 
     FROM qryFilteredScores sub 
     WHERE ([AdmissionID]=Dupe.[AdmissionID] 
     AND ((sub.ClassID)=[Forms]![frmReports]![lstB]) 
     AND ((tblScores.ExamID)=[Forms]![frmReports]![lstC])) 
     GROUP BY sub.AdmissionID) AS Total 
ON Dupe.AdmissionID = Total.AdmissionID 
GROUP BY Dupe.AdmissionID, Total.TotalScore 
ORDER BY Dupe.AdmissionID; 
+0

しかし、これはどこで学生一人当たりトップ7の得点を取るのですか? 'qryFilteredScores'を表示したいかもしれません。また、外部クエリと相関するのではなく、単に一致するIDであるため、サブクエリを 'JOIN'に移動する方が効率的です。 – Parfait

+0

7つの最高の被験者スコアに基づくGPAを計算するためには、上位7つのスコアが必要でした。私は、レポートで関数呼び出しを避けたかったのです。なぜなら、私はより良いパフォーマンスが得られると思っているという理由で、純粋なSQLソリューション(したがってメインクエリ内のサブクエリ)をレポートに必要としていました。私は間違っていた。レポートの作成には3分以上かかります。ありがとうございました。 – Wakwehu

+0

あなたは私の質問に答えなかった。あなたの受け入れられた解決策では、学生のトップ7の得点にフィルタリングを適用しますか?これは明確に示され、名前付きクエリの内容は不明です。この投稿の今後の読者は、理解が難しいでしょう。なぜ関数呼び出しについて言及していますか?ここで行うのはSQLだけです。そして、このクエリ*は、テーブルの各行に対して別々の選択を避けて、結合されたテーブルであるサブクエリを実行するときに時間がかかるでしょう。編集された代替案を参照してください。 – Parfait

0

はこれを試してみてください:

SELECT TOP 7 Sum(tblScores.Scores) AS Total, tblScores.AdmissionID 
FROM tblScores 
HAVING (((tblScores.ExamID)=[Forms]![frmReports]![lstC]) AND ((tblScores.ClassID)=[Forms]![frmReports]![lstB])) 
GROUP BY tblScores.AdmissionID 
ORDER BY Sum(tblScores.Scores) DESC; 
+0

@ Laurenceそれは私が最初に試したものです。私は最初の最高の学生の合計得点を得るでしょう。私が欲しいのは、全学生の7つの最高得点の合計です。 – Wakwehu

+0

実際、 'WHERE'から' HAVING'節への移動条件は違いはありません。 – Parfait

1

はスコアの実行中のランクを計算する相関サブクエリを考えてみましょう。その後、巣の派生テーブルで、この選択クエリが(ネクタイを含む)各学生のトップ7のスコアによってフィルタリング集約、スコア:パフェ@

SELECT main.AdmissionID, Sum(main.Scores) As [Total] 
FROM 
    (SELECT tblScores.AdmissionID, tblScores.Scores, 
     (SELECT Count(*) FROM tblScores sub 
      WHERE sub.AdmissionID = tblScores.AdmissionID 
      AND sub.Scores >= tblScores.Scores) As ScoreRank 
    FROM tblScores 
    WHERE (((tblScores.ExamID)=[Forms]![frmReports]![lstC]) 
    AND ((tblScores.ClassID)=[Forms]![frmReports]![lstB])) 
) As main 
WHERE main.ScoreRank <= 7 
GROUP BY main.AdmissionID 
+0

@ parfait - コンセプトはうまくいきます。しかし、私はあなたの例に続く問題を抱えています。フィルタリングされた部分は、私が迷子になった場所です。あなたは説明してもらえますか – Wakwehu

+0

しかし、それは動作しますか? * main * aliasにラップされたネストされた 'SELECT'クエリを単独で実行すると、学生のスコアの* ScoreRank *列が最高から最低まで表示されます。 – Parfait

+0

次に、このネストされたものをソースとして使用して* ScoreRank * 7以下を取る、別の集計クエリを実行します。これは、生徒1人あたりトップ7スコア*を意味します。実際、MS Accessではネストされたサブクエリは必要ありませんが、最後のもので参照される別のクエリとして保存できます。 – Parfait