Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用户可选择时间表的表格设计和使用PIVOT选择_Sql_Sql Server 2008_Pivot - Fatal编程技术网

Sql 用户可选择时间表的表格设计和使用PIVOT选择

Sql 用户可选择时间表的表格设计和使用PIVOT选择,sql,sql-server-2008,pivot,Sql,Sql Server 2008,Pivot,我正在创建一个日程安排应用程序,允许员工输入存储在表中的所需日程安排。下面是使用SQL2008R2的当前设计 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 [

我正在创建一个日程安排应用程序,允许员工输入存储在表中的所需日程安排。下面是使用SQL2008R2的当前设计

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
    )
)
需要注意的几件事

  • 用户可能没有输入特定日期范围的计划,但仍希望看到其姓名列表中没有计划
  • 用户可以不为一周中的某一天选择任何内容,但为其他日期选择某些内容
  • 开始是班次的开始
  • Length是班次的小时数,每天和每个人的班次可能会有很大差异
  • 原因列用于用户选择的内容(W-Work、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 '('.
质疑


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

看起来您正在尝试根据第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

结果:


工作得很好。我相信我现在明白这些是怎么工作的了。谢谢你的快速帮助。
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