【问题标题】:SQL Server 2008 Pivot Query - DatetimeSQL Server 2008 透视查询 - 日期时间
【发布时间】:2016-10-21 05:25:53
【问题描述】:

我在多行中有员工进出时间的记录,如何查询具有相同 id、名称但进出时间不同的数据透视?

如下图所示:

【问题讨论】:

    标签: sql-server-2008 pivot pivot-table


    【解决方案1】:

    您可以像这样使用旋转:

    ;WITH dtrTable AS (  --just a test sample of your table
    SELECT *
    FROM (VALUES
    (1, 'emp1', '2016-10-20', '2016-10-20 10:00:00.000', '2016-10-20 15:00:00.000'),
    (1, 'emp1', '2016-10-20', '2016-10-20 15:30:00.000', '2016-10-20 17:00:00.000'),
    (1, 'emp1', '2016-10-20', '2016-10-20 18:30:00.000', '2016-10-20 19:00:00.000'),
    (2, 'emp2', '2016-10-20', '2016-10-20 10:00:00.000', '2016-10-20 19:00:00.000'),
    (2, 'emp2', '2016-10-20', '2016-10-20 21:00:00.000', '2016-10-20 22:00:00.000'),
    (2, 'emp2', '2016-10-21', '2016-10-20 11:00:00.000', '2016-10-20 21:00:00.000')
    ) as t(empId, empName, dtrDate, dtrIn, dtrOut)
    )
    
    SELECT *
    FROM (
        SELECT  empId, 
                empName, 
                dtrDate,
                [Columns]+seq as [Columns],
                [Values]
        FROM (
            SELECT *,
                    CAST(ROW_NUMBER() OVER (PARTITION BY empId, dtrDate ORDER BY dtrIn) as nvarchar(100)) as seq
            FROM dtrTable
        ) as t
        UNPIVOT (
            [Values] FOR [Columns] IN ([dtrIn],[dtrOut])
        ) as unpvt
    ) as d
    PIVOT (
        MAX([Values]) FOR [Columns] IN ([dtrIn1],[dtrOut1],[dtrIn2],[dtrOut2],[dtrIn3],[dtrOut3])
    ) as pvt
    

    输出:

    empId   empName dtrDate     dtrIn1                  dtrOut1                 dtrIn2                  dtrOut2                 dtrIn3                  dtrOut3
    1       emp1    2016-10-20  2016-10-20 10:00:00.000 2016-10-20 15:00:00.000 2016-10-20 15:30:00.000 2016-10-20 17:00:00.000 2016-10-20 18:30:00.000 2016-10-20 19:00:00.000
    2       emp2    2016-10-20  2016-10-20 10:00:00.000 2016-10-20 19:00:00.000 2016-10-20 21:00:00.000 2016-10-20 22:00:00.000 NULL                    NULL
    2       emp2    2016-10-21  2016-10-20 11:00:00.000 2016-10-20 21:00:00.000 NULL                    NULL                    NULL                    NULL    
    

    Unpivot 部分将为您提供此表:

    empId   empName dtrDate     Columns Values
    1       emp1    2016-10-20  dtrIn1  2016-10-20 10:00:00.000
    1       emp1    2016-10-20  dtrOut1 2016-10-20 15:00:00.000
    1       emp1    2016-10-20  dtrIn2  2016-10-20 15:30:00.000
    1       emp1    2016-10-20  dtrOut2 2016-10-20 17:00:00.000
    1       emp1    2016-10-20  dtrIn3  2016-10-20 18:30:00.000
    1       emp1    2016-10-20  dtrOut3 2016-10-20 19:00:00.000
    2       emp2    2016-10-20  dtrIn1  2016-10-20 10:00:00.000
    2       emp2    2016-10-20  dtrOut1 2016-10-20 19:00:00.000
    2       emp2    2016-10-20  dtrIn2  2016-10-20 21:00:00.000
    2       emp2    2016-10-20  dtrOut2 2016-10-20 22:00:00.000
    2       emp2    2016-10-21  dtrIn1  2016-10-20 11:00:00.000
    2       emp2    2016-10-21  dtrOut1 2016-10-20 21:00:00.000
    

    这里我使用ROW_NUMBER() 和分区来给进出一些顺序。还有由ROW_NUMBER() 生成的数字有助于创建列,我们不能在数据透视部分使用相同的列名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      相关资源
      最近更新 更多