0

「値」が最も低い上位 10 人の学生を表示するテーブルを Web サイトに作成しようとしています。私のデータベースには実際の「値」列はなく、代わりに「grade1」と「grade2」というタイトルの 2 つの列があります。私の目標は、クエリがグレード1またはグレード2の列にあるかどうかにかかわらず、最も低い10の結果を「値」として表示することです。

クエリは次のとおりです。

SELECT TOP 10 p.class, e.teacher, k.notes, s.grade1, s.grade2
            , s.gradedmethod, k.studentid
            , CASE WHEN s.gradedmethod= 'A' OR s. gradedmethod= 'B' THEN s.grade1
                   ELSE s.grade2 END AS value
FROM Table1 k 
INNER JOIN Table2 p ON p.class = k.class 
INNER JOIN Table3 d ON d.tier = p.tier 
INNER JOIN Table4 e ON e.teacher = p.teacher 
INNER JOIN Table5 s ON k.studentid = s.studentid 
WHERE s.examdate IN 
      (SELECT MAX(st.examdate) 
       FROM Table5 st 
       WHERE st.studentid = s.studentid 
       GROUP BY st.studentid) 
   AND k.reportcard IS NULL AND (k.cardtype = 'X' OR k.cardtype = 'Y') 
ORDER BY value ASC 

出力のサンプルを次に示します (編集: GRADE1/GRADE2/VALUE のみを含むように圧縮された結果):

    Class/Teacher/Notes/Grade1/Grade2/MeasureMethod/Studentid/Value
   NULL/35/NULL
   NULL/82/NULL
   NULL/88/NULL
   NULL/87/NULL
   0/100//0
   19/21/19
   24/13/24
   27/40/27
   NULL/28/28
   33/23/33

ご覧のとおり、値列の最初の 4 つの結果が Grade2 である必要があるときに NULL として表示されているため、何か問題が発生していますが、9 行目では正しく機能していました...

最後に、別の問題は、学生が 3 回以上採点された場合にのみクエリに結果を含めたいことです。*注: grade1 と grade2 は、実際には同じ試験の 2 つのセクションです。すべての生徒が採点した試験は、列 grade1 と grade2 を含む table5 の行です。したがって、同じ学生 ID を持つ行が 3 つ以上ある場合は、その学生を含める必要があります。

私は初心者のプログラマーであり、これを実現する方法がわからず、この時点で私の研究は私をさらに混乱させるだけであるため、この時点でブロックしています。あなたの助けに感謝します。

4

1 に答える 1

1

あなたのケースステートメントは、学生のgradedmethodが「A」または「B」の場合、grade1を返すと述べています...たとえそれがnullであっても。したがって、次のいずれかが必要です。

  • 生徒の採点方法を「A」または「B」にならないように変更する、または
  • case ステートメントを変更して、「AND grade 1 is not null」を最初の WHEN 条件に追加し、grade1 が null の場合に grade2 にフォールバックします。

要件が何であるかわからない (非 NULL 成績を表示しない? gradedmethod は正確には何をする?) ため、表示されているものを回避する方法を確実に伝えることはできません。

3 つの成績を持つ学生を取得するには、次の JOIN をクエリに追加します。

INNER JOIN (select studentid from Table5 group by studentid having count(studentid) > 3) threeGrades on threeGrades.studentid = s.studentid
于 2013-03-07T17:07:27.950 に答える