员工状态的日期时间的高级聚合数据透视

时间:2017-04-02 08:23:19

标签: sql sql-server sql-server-2008-r2 pivot dynamic-pivot

我正在使用一个存储各种状态类型的时间戳的表格,我希望它能够更清晰地了解每个员工实际的“忙碌”时间...(所以我可以运行工作负载/统计数据)

有一些警告......

  • 员工可以错误地将自己分配两次(在示例数据中参见第5行的EMP1),我希望枢轴使用最早的时间

  • 员工可以将自己设置为FRO或FRV(两者都是免费进行新任务的变体),因此无论员工是FRO还是FRV,它都应该在FREE列中显示两种状态类型中的任何一种

状态类型:

  • ST =开始/分配
  • IP =正在进行的工作
  • FRV =车辆免费
  • FRO =免费上任

状态表的示例数据:

 DateTime              emp      status
 3/26/2017 14:20:30    EMP1      ST
 3/26/2017 14:21:16    EMP1      FRO
 3/26/2017 14:26:11    EMP1      ST
 3/26/2017 14:26:42    EMP1      IP
 3/26/2017 14:26:45    EMP1      IP
 3/26/2017 14:28:35    EMP1      FRO
 3/26/2017 14:21:15    EMP2      ST
 3/26/2017 14:22:35    EMP2      IP
 3/26/2017 14:55:53    EMP2      FRV
 3/26/2017 14:20:48    EMP3      ST
 3/26/2017 14:23:49    EMP3      FRV

枢轴后的预期结果如下所示:
(ST =开始,IP =正在进行中,自由=不忙)

emp     ST                      IP                     FREE        
EMP1    3/26/2017 14:20:30      null                   3/26/2017 14:21:16
EMP1    3/26/2017 14:26:11      3/26/2017 14:26:42     3/26/2017 14:28:35
EMP2    3/26/2017 14:21:15      3/26/2017 14:22:35     3/26/2017 14:55:53
EMP3    3/26/2017 14:20:48      null                   3/26/2017 14:23:49

带有样本数据的测试表。

CREATE TABLE test (
      [DateTime] [datetime] NULL,
      [emp] [varchar](6) NOT NULL,
      [status] [varchar](6) NOT NULL
      )

INSERT INTO test values 
('2017-03-26 14:20:30.000', 'EMP1', 'ST'),
('2017-03-26 14:21:16.000', 'EMP1', 'FRO'),
('2017-03-26 14:26:11.000', 'EMP1', 'ST'),
('2017-03-26 14:26:42.000', 'EMP1', 'IP'),
('2017-03-26 14:26:45.000', 'EMP1', 'IP'),
('2017-03-26 14:28:35.000', 'EMP1', 'FRO'),
('2017-03-26 14:21:15.000', 'EMP2', 'ST'),
('2017-03-26 14:22:35.000', 'EMP2', 'IP'),
('2017-03-26 14:55:53.000', 'EMP2', 'FRV'),
('2017-03-26 14:20:48.000', 'EMP3', 'ST'),
('2017-03-26 14:23:49.000', 'EMP3', 'FRV')

任何帮助非常感谢,很高兴进一步解释请求是否过于模糊......

由于

1 个答案:

答案 0 :(得分:0)

我将此逻辑视为:您希望根据每个开始对记录进行分组。一旦你有了这个小组,剩下的只是聚合。

在SQL Server 2012+中,分配组很容易。 。 。它是每个记录的启动次数的累积总和。在SQL Server 2008中,这更棘手。但是你可以用相关的子查询来做到这一点:

select emp,
       min(case when status = 'ST' then datetime end) as st,
       min(case when status = 'IP' then datetime end) as ip,
       max(case when status in ('FRQ', 'FRV') then datetime end) as fr
from (select t.*,
             (select count(*)
              from test t2
              where t2.emp = t.emp and t2.datetime <= t.datetime and
                    t2.status = 'ST'
             ) as grp
      from test t
     ) t
group by emp, grp;

Here是一个SQL小提琴。

相关问题