不需要太多细节,我需要根据工作流程创建报告。每个工作都有一个开始时间,一个或多个工作事件和一个结束时间。作业本身存储在一个表中,事件(包括开始时间,结束时间和任何其他事件)存储在另一个表中。我的报告需要一行来显示每个作业何时开始以及何时发生指定事件。到目前为止没问题。
但是,作业可能有多个开始和结束时间。例如,如果作业开始,则发现存在设备问题,工作人员可以返回,修复问题,然后再次离开。在这种情况下,报告对于每个开始/结束时段都需要单独的行。所以,比如:
Job# 2b Job start 10am work done Job end 11am
Job# 2b Job start 1pm work done Job end 3pm
不确定实现这一目标的最佳方法是什么。
答案 0 :(得分:1)
根据您的说明,您的数据如下所示:
create table Jobs
(
jobID int
, jobName varchar(100)
)
create table Events
(
jobID int
, eventDate datetime
, eventText varchar(100)
)
insert into Jobs select 1, 'Job1'
insert into Jobs select 2, 'Job2'
insert into Events select 1, '01-jan-2013 10:00', 'Start'
insert into Events select 1, '01-jan-2013 10:30', 'Work'
insert into Events select 1, '01-jan-2013 11:00', 'End'
insert into Events select 2, '01-jan-2013 10:00', 'Start'
insert into Events select 2, '01-jan-2013 10:10', 'Work'
insert into Events select 2, '01-jan-2013 10:20', 'End'
insert into Events select 2, '01-jan-2013 10:30', 'Start'
insert into Events select 2, '01-jan-2013 10:40', 'Work'
insert into Events select 2, '01-jan-2013 10:50', 'End'
insert into Events select 2, '01-jan-2013 11:00', 'Start'
insert into Events select 2, '01-jan-2013 11:10', 'Work'
您想要获得的是每个开始/结束组合一行。您可以通过选择开始行,然后加入Events
表以获取后续结束行来执行此操作:
select j.jobName, startDate = e.eventDate, endDate = endEvent.eventDate
from Jobs j
inner join Events e on j.jobID = e.jobID
outer apply
(
select top 1 ee.eventDate
from Events ee
where e.jobID = ee.jobID
and e.eventDate < ee.eventDate
and ee.eventText = 'End'
order by ee.eventDate
) endEvent
where e.eventText = 'Start'
给出结果:
JOBNAME STARTDATE ENDDATE
Job1 January, 01 2013 10:00:00+0000 January, 01 2013 11:00:00+0000
Job2 January, 01 2013 10:00:00+0000 January, 01 2013 10:20:00+0000
Job2 January, 01 2013 10:30:00+0000 January, 01 2013 10:50:00+0000
Job2 January, 01 2013 11:00:00+0000 (null)
您应该能够适应您的数据/表格。
获得此最终结果集后,您可以轻松地将其用作标准SSRS表的数据集。