1

従業員がテーブルに保存されている希望のスケジュールを入力できるスケジューリング アプリケーションを作成しています。私が見ている現在の設計は、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

PIVOTSQL 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

これを最適に実装する方法や、私がここでどれほど間違っているかについての考えはありますか?

4

1 に答える 1

2

曜日 1 ~ 7 に基づいてデータを PIVOT しようとしているようです。これを機能させるには、これを少し変更することをお勧めします。

SELECT *
FROM
(
    select EmpNum,
        reason,
        datepart(dw, start) as DyOfWk
    from #Schedule
) s
pivot (
    max(Reason)
    for dyofwk in ([1], [2], [3], [4], [5], [6], [7])
) as Pvt

デモで SQL Fiddle を参照してください

結果:

ここに画像の説明を入力

于 2012-08-02T18:33:22.983 に答える