これは、あなたに役立つかもしれないSQLステートメントです。
SELECT course,
Convert(varchar(25), course_date, 101) AS course_date
FROM (SELECT course_no AS course,
DATEADD(dd, rn-1, startdate) AS course_date,
DATENAME(dw, DATEADD(dd, rn-1, startdate)) AS dow
FROM (SELECT row_number() OVER (ORDER BY c1) AS rn
FROM dummy) sub1,
classtimes
WHERE rn <= (DATEDIFF(dd, startdate, enddate)+1)
) list_of_dates,
(SELECT course_no,
(CASE monday WHEN 1 THEN 'Monday' END) AS dow
FROM classtimes
UNION
SELECT course_no,
(CASE tuesday WHEN 1 THEN 'Tuesday' END)
FROM classtimes
UNION
SELECT course_no,
(CASE wednesday WHEN 1 THEN 'Wednesday' END)
FROM classtimes
UNION
SELECT course_no,
(CASE thursday WHEN 1 THEN 'Thursday' END)
FROM classtimes
UNION
SELECT course_no,
(CASE friday WHEN 1 THEN 'Friday' END)
FROM classtimes
UNION
SELECT course_no,
(CASE saturday WHEN 1 THEN 'Saturday' END)
FROM classtimes
UNION
SELECT course_no,
(CASE sunday WHEN 1 THEN 'Sunday' END)
FROM classtimes
) class_days
WHERE list_of_dates.dow = class_days.dow
AND list_of_dates.course = class_days.course_no
ORDER BY course_no,
course_date
クエリを使用しました
SELECT course_no AS course,
DATEADD(dd, rn-1, startdate) AS course_date,
DATENAME(dw, DATEADD(dd, rn-1, startdate)) AS dow
FROM (SELECT row_number() OVER (ORDER BY c1) AS rn
FROM dummy) sub1,
classtimes
WHERE rn <= (DATEDIFF(dd, startdate, enddate)+1)
各コースの開始日から終了日までのすべての日付のリストを生成します。このクエリが正しく機能するためには、ダミーテーブルに少なくとも各コースの開始日と終了日の間の日数と同じ数の行が含まれている必要があります。したがって、この結果は、各コースの開始日から終了日までの日数と、その日付の曜日のリストです。
| COURSE | COURSE_DATE | DOW |
------------------------------------
| MATH | 06/03/2013 | Monday |
| MATH | 06/04/2013 | Tuesday |
| MATH | 06/05/2013 | Wednesday |
| MATH | 06/06/2013 | Thursday |
| MATH | 06/07/2013 | Friday |
.........
.........
| MATH | 06/24/2013 | Monday |
| MATH | 06/25/2013 | Tuesday |
| MATH | 06/26/2013 | Wednesday |
次に、一連の UNION を使用して classtimes テーブルから曜日の列を取得し、クラスが開催される曜日を生成するサブクエリを作成します。次に、list_of_dates サブクエリと class_days サブクエリを結合して、クラスが開催される日付を取得します。
| COURSE | COURSE_DATE |
-------------------------
| MATH | 06/03/2013 |
| MATH | 06/05/2013 |
| MATH | 06/10/2013 |
| MATH | 06/12/2013 |
| MATH | 06/17/2013 |
| MATH | 06/19/2013 |
| MATH | 06/24/2013 |
| MATH | 06/26/2013 |
classtimes テーブル (class_days サブクエリ) からクラスの曜日のリストを生成するより効率的でエレガントな方法があると確信していますが、思いつきませんでした。