1

私が依頼しているプロジェクトは、次の学期の授業でどの本を使用しているかを尋ねるメールを教師に送信して、本を注文できるようにすることです。この次の学期のクラスのコース番号を過去の教科書注文のコース番号と比較し、今学期に教えられているクラスのみを抽出するクエリがあります。それが私が迷子になるところです。

以下を含むテーブルがあります。

  • 教授
  • コース番号
  • 本のタイトル

データは次のようになります。

professor year course number title
--------- ---- ------------- -------------------
smith       13 1111          Pride and Prejudice
smith       13 1111          The Fountainhead
smith       13 1222          The Alchemist
smith       12 1111          Pride and Prejudice
smith       11 1222          Infinite Jest
smith       10 1333          The Bible
smith       13 1333          The Bible
smith       12 1222          The Alchemist
smith       10 1111          Moby Dick
johnson     12 1222          The Tipping Point
johnson     11 1333          Anna Kerenina
johnson     10 1333          Everything is Illuminated
johnson     12 1222          The Savage Detectives
johnson     11 1333          In Search of Lost Time
johnson     10 1333          Great Expectations
johnson      9 1222          Proust on the Shore

「紙の上」でコードを実行する必要があるのは次のとおりです。教授ごとにレコードをグループ化します。そのグループ内のすべての一意のコース番号を決定し、コース番号でレコードをグループ化します。一意のコース番号ごとに、関連付けられている最高の年を決定します。次に、その教授+コース番号+年の組み合わせですべてのレコードを吐き出します。

サンプル データを使用すると、結果は次のようになります。

professor year course number title
--------- ---- ------------- -------------------
smith       13 1111          Pride and Prejudice
smith       13 1111          The Fountainhead
smith       13 1222          The Alchemist
smith       13 1333          The Bible
johnson     12 1222          The Tipping Point
johnson     11 1333          Anna Kerenina
johnson     12 1222          The Savage Detectives
johnson     11 1333          In Search of Lost Time

先生ごとにレコードセットを作り、その中にコース番号ごとに別のレコードセットを作ろうと思っています。コース番号レコード セット内で、最も高い年度番号を特定するシステムが必要です。それを変数に格納することはできますか? 次に、関連するすべてのレコードを引き出して、教師が最後にそのクラスを教えたときに 3 冊の本を注文した場合 (2013 年か 2012 年かなど)、3 冊の本すべてが表示されるようにします。ただし、レコード セットを正しい方法で考えているかどうかはわかりません。

これまでの私の SQL は基本的なものであり、明らかに機能しません。

SELECT [All].Professor, [All].Course, Max([All].Year)
FROM [All]
GROUP BY [All].Professor, [All].Course;
4

1 に答える 1

2

クエリをサブクエリとして使用INNER JOINし、テーブルに戻って[ALL]行をフィルタリングします。

SELECT
    a.Professor,
    a.Year,
    a.Course,
    a.title
FROM
    [ALL] AS a
    INNER JOIN
        (
            SELECT [All].Professor, [All].Course, Max([All].Year) AS MaxOfYear
            FROM [All]
            GROUP BY [All].Professor, [All].Course
        ) AS sub
    ON
            a.Professor = sub.Professor
        AND a.Course = sub.Course
        AND a.Year = sub.MaxOfYear;
于 2013-10-31T22:14:46.640 に答える