0

SQL データベースに 2 つのテーブルがあります。'course' および 'event' の場合、コース テーブルには courseID (pk)、coursecode、および coursetitle フィールドがあります。イベント テーブルには、eventID (pk) courseID (fk)、startdate、enddate があります。

イベント テーブルの startdate を使用して、すべてのコースのリストを、コースが最後に開催された日付と次の予定日を示す列と共に返す必要があります。

次のように、イベント テーブル内の特定のコースの最新の日付または次の日付を取得できます。

SELECT TOP 1
    startdate as nextdate    
FROM event

WHERE 
    CONVERT(VARCHAR(8),startdate,112) > CONVERT(VARCHAR(8), GETDATE(), 112)
    AND coursecode = 'acc01'

ORDER BY startdate ASC

結果が次のように表示されることを望みます。

+------------+-------------+------------+-------------+------------+-------------+
| coursecode | coursetitle | lastevent  | lasteventid | nextevent  | nexteventid |
+------------+-------------+------------+-------------+------------+-------------+
| acc01      | Access      | 2012-09-30 | 20127       | 2013-12-10 | 35612       | 
| wrd37      | Word        | 2013-11-02 | 34816       | NULL       | NULL        |
+------------+-------------+------------+-------------+------------+-------------+

各コースコードを 1 回表示する必要があります (コースはさまざまなサプライヤーから提供されているため、コースコードは一意のフィールドではない可能性があるため、courseid フィールドです)。コースに過去の日付、未来の日付、または日付がまったくない可能性があります。これらの日付/イベント ID フィールドは Null で問題ありません。レポート デザインでフォーマットするからです。

質問を繰り返さないことを願っていますが、これまでのところ何も見つかりませんでした。

助けてくれてありがとう

4

2 に答える 2

0

使用している SQL のフレーバーに応じて、次のようなことを試してください。

;WITH cteEventsLast
AS
(
    SELECT e.CourseID, 
           MAX(e.StartDate) AS StartDate
    FROM Event e
    WHERE e.StartDate < GETDATE()
    GROUP BY e.CourseID
),

WITH cteEventsNext
AS
(
    SELECT e.CourseID, 
           MIN(e.StartDate) AS StartDate
    FROM Event e
    WHERE e.StartDate >= GETDATE()
    GROUP BY e.CourseID
)

SELECT c.CourseCode,
       c.CourseTitle,
       el.StartDate AS LastEvent,
       en.StartDate AS NextEvent
FROM Course c LEFT OUTER JOIN
     cteEventsLast el ON (el.CourseID = c.CourseID) LEFT OUTER JOIN
     cteEventsNext en ON (en.CourseID = c.CourseID)

この例では、TSQL / MSSQL サーバーに使用できる一般的なテーブル式を使用しています。ただし、SQL フレーバーによっては、わずかに異なる SQL を使用する必要がある場合があります。

CTE を使用できない場合は、代わりに cteEventsLast と cteEventsNext を FROM 句のサブクエリとして作成できます

私も使いません

CONVERT(VARCHAR(8),startdate,112) > CONVERT(VARCHAR(8), GETDATE(), 112)

質問にあるように、日付を比較します。代わりに、日付を直接比較するだけです。つまり、このように

startdate > GETDATE()
于 2013-11-04T11:11:48.297 に答える