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
    )
)

需要注意的几点

  • 用户可能没有输入特定日期范围的时间表,但仍希望看到他们的姓名列出但没有时间表
  • 用户可以在一周中的某一天不选择任何内容,但在其他日子选择某些内容
  • 开始是转变的开始
  • 长度是一个班次的小时数,可能会因人而异,因人而异
  • 原因列用于用户选择的内容(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

关于如何最好地实现这一点或我在这里有多么严重的错误有什么想法吗?

4

1 回答 1

2

看起来您正在尝试根据第 1-7 周的日期来透视您的数据。我建议对此稍作改动以使其正常工作:

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 回答