従業員がテーブルに保存されている希望のスケジュールを入力できるスケジューリング アプリケーションを作成しています。私が見ている現在の設計は、SQL 2008 R2 を使用したものです。
CREATE TABLE [dbo].[Schedule] (
[EmpNum] [varchar](10) NOT NULL,
[Start] [datetime] NOT NULL,
[Length] [decimal](18, 2) NOT NULL,
[Reason] [varchar](1) NOT NULL,
CONSTRAINT [PK_Schedule] PRIMARY KEY CLUSTERED
(
[EmpNum] ASC,
[Start] ASC
)
)
注意事項
- ユーザーが特定の日付範囲のスケジュールを入力していない場合、自分の名前をリストに表示したいが、スケジュールがない場合があります
- ユーザーは、1 週間のうちの 1 日について何も選択しない場合がありますが、他の日については何かを選択します。
- 開始はシフトの開始です
- 長さはシフトの時間数であり、日によって、また人によって大きく異なる場合があります
- 理由の列は、ユーザーが選択したものです (W - 仕事、P - PTO など)。
サンプルデータはこちら
EmpNum Start Length Reason
---------- ----------------------- --------------------------------------- ------
000001 2012-08-02 09:00:00.000 12.00 W
000001 2012-08-04 08:00:00.000 9.50 P
000002 2012-08-02 08:30:00.000 10.00 W
000002 2012-08-03 19:00:00.000 12.00 W
000003 2012-08-03 08:00:00.000 8.00 P
私が望む出力はこのようなものです
EmpNum [0] [1] [2] [3] [4] [5] [6]
---------- ------ ------ ------ ------ ------ ------ ------
000001 NULL NULL NULL NULL W NULL P
000002 NULL NULL NULL NULL W W NULL
000003 NULL NULL NULL NULL NULL P NULL
PIVOT
SQL 2000 からアップグレードしたばかりなので、これまでクエリを使用したことがありません。以下のエラーで失敗する以下のクエリを作成しましたが、行き詰まりました。
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near '('.
クエリ
declare @FirstDayOfWeek date
set @FirstDayOfWeek = '7/29/2012'
select EmpNum,
@FirstDayOfWeek [0],
dateadd(day, 1, @FirstDayOfWeek) [1],
dateadd(day, 2, @FirstDayOfWeek) [2],
dateadd(day, 3, @FirstDayOfWeek) [3],
dateadd(day, 4, @FirstDayOfWeek) [4],
dateadd(day, 5, @FirstDayOfWeek) [5],
dateadd(day, 6, @FirstDayOfWeek) [6]
from Schedule
pivot (
max(Reason)
for Start in ([0], [1], [2], [3], [4], [5], [6])
) as Pvt
これを最適に実装する方法や、私がここでどれほど間違っているかについての考えはありますか?