VBA / SQL记录集

时间:2013-10-31 21:51:03

标签: sql vba ms-access

我要问的项目是向教师发送一封电子邮件,询问他们在下学期教授的课程中使用了哪些书籍,以便订购书籍。我有一个查询,将即将到来的学期课程的课程编号与历史教科书订单的课程编号进行比较,只抽出本学期正在教授的课程。那就是我迷路的地方。

我有一张包含以下内容的表格:

  • 教授
  • 课程编号
  • 书名

数据如下所示:

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年等等,都会显示三本书。不过,我不确定我是否正在以正确的方式考虑记录集。

到目前为止,我的SQL是基本的,显然不起作用:

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

1 个答案:

答案 0 :(得分: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;