0

いくつかのスケジューリング機能を備えたアプリに取り組んでいます。その一環として、特定の期間に予定されている人のリストと、その人が何かを予定しているかどうかを選択する必要があります。

週の期間数は可変であるため、次のように参照テーブルに格納されます。

Period Reference Table

id   name       start                 end                     day
------------------------------------------------------------------
1    Morning    1900-01-01 4:00:00    1900-01-01 11:00:00     MON
2    Afternoon  1900-01-01 14:00:00   1900-01-01 20:00:00     MON  
3    Night      1900-01-01 20:00:00   1900-01-01 24:00:00     MON  
4    Morning    1900-01-01 4:00:00    1900-01-01 11:00:00     TUE
5    Afternoon  1900-01-01 14:00:00   1900-01-01 20:00:00     TUE  
6    Night      1900-01-01 20:00:00   1900-01-01 24:00:00     TUE 

「個人参照」テーブルと「個人スケジュール」テーブルもあります。「個人スケジュール」テーブルには、ある期間に何かがスケジュールされている場合にのみレコードが格納されます。簡単な例を次に示します。

Person Schedule Table

id    person_id     period_id
------------------------------
1     1             2
2     1             3
3     2             2
4     2             3
5     2             4

次に、これら3つの表から、各人の期間の完全なリストと、その期間にスケジュールレコードがあるかどうか(1または0)を選択する必要があります。つまり、上記のサンプルデータの結果セットを取得する必要があります。

person_id     period_id     is_scheduled
----------------------------------------
1             1             0
1             2             1
1             3             1
1             4             0
1             5             0
1             6             0
2             1             0
2             2             1
2             3             1
2             4             1
2             5             0
2             6             0

動的SQLに入らずにselectステートメントでこれを行うことは可能ですか?

これはすべてSQLServer2000を使用して行われます

4

1 に答える 1

1
SELECT 
  people.person_id, period_id = periods.id, is_scheduled = CASE
  WHEN schedule.person_id IS NOT NULL THEN 1 ELSE 0 END
FROM dbo.[period reference table] AS periods
CROSS JOIN 
(
  SELECT person_id 
    FROM dbo.[person schedule table] 
    GROUP BY person_id
) AS people
LEFT OUTER JOIN 
  dbo.[person schedule table] AS schedule
  ON people.person_id = schedule.person_id
  AND periods.id = schedule.period_id
ORDER BY 
  people.person_id, p.id;
于 2012-06-09T02:49:41.680 に答える