我正在创建一个日程安排应用程序,允许员工输入存储在表格中的所需日程安排。我正在查看的当前设计如下使用 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
)
)
需要注意的几点
- 用户可能没有输入特定日期范围的时间表,但仍希望看到他们的姓名列出但没有时间表
- 用户可以在一周中的某一天不选择任何内容,但在其他日子选择某些内容
- 开始是转变的开始
- 长度是一个班次的小时数,可能会因人而异,因人而异
- 原因列用于用户选择的内容(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
自从我们刚刚从 SQL 2000 升级以来,我以前从未使用过PIVOT
查询,所以请耐心等待。我已经构建了以下查询,该查询因以下错误而失败并且我被卡住了。
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
关于如何最好地实现这一点或我在这里有多么严重的错误有什么想法吗?