如何找到项目的活跃日子

时间:2015-04-17 02:48:24

标签: sql sql-server-2008

我需要使用输入月份和年份动态创建一个月的天数。 我有一个项目表,可以保存项目开始日期和结束日期。 我也有可以在许多项目中工作的员工。

我必须找到的场景如下

如果我的输入是年份= 2015年和月份= 04

===============================================
Empname     01          02           03 ---  31
===============================================
 emp1       Active   project end
===============================================

我必须找出一名员工是否与该员工有关 特别的一天。我该怎么做?

1 个答案:

答案 0 :(得分:0)

我修改了这个例子,希望能够接近你想要达到的目标(非常不确定)。整个事情也可以在这个SQLFiddle中找到:http://sqlfiddle.com/#!6/f209a/7

CREATE TABLE employee_active_on_project
(
    EmpName varchar(50),
    ProjectName varchar(50),
    StartOfProject datetime,
    EndOfProject datetime
);

CREATE Table employee
(
    EmpName varchar(50)
);

CREATE TABLE employee_projects
(
    ProjectName varchar(50),
    EmpName varchar(50)
);

CREATE TABLE result
(
    EmpName varchar(50),
    ProjectName varchar(50),
    IsActive int,
    DayOfMon int
);

insert into employee_active_on_project select 'john', 'projectx', '2015-04-02','2015-04-05'; 
insert into employee_active_on_project select 'john', 'projectx', '2015-04-09','2015-04-25';
insert into employee_active_on_project select 'john', 'projecty', '2015-04-06','2015-04-07';
insert into employee_active_on_project select 'jane', 'projectz', '2015-04-01','2015-04-27';
insert into employee select 'john';
insert into employee select 'jane';
insert into employee_projects select 'projectx', 'john';
insert into employee_projects select 'projecty', 'john';
insert into employee_projects select 'projectx', 'john';
insert into employee_projects select 'projectz', 'jane';

DECLARE @month int
DECLARE @year int
DECLARE @firstDay datetime
DECLARE @lastDay datetime
SET @month = 4
SET @year = 2015
SET @firstDay = DATEFROMPARTS(@year,@month,1)
SET @lastDay = DateAdd(day,-1,Dateadd(month,1,@firstDay))

;WITH CTE( oneDay, DayOfMon) as
(
  SELECT @firstDay as oneDay, 1 as DayOfMon
  UNION ALL
  SELECT dateadd(day, 1, oneDay), DayOfMon + 1 FROM CTE
  where dateadd(day, 1, oneDay) <= @lastDay
)
insert into result
SELECT
    emp.EmpName,
    ep.ProjectName,
    CASE WHEN e.EmpName IS NOT NULL THEN 1 ELSE 0 END as IsActive,
    DayOfMon
FROM Employee emp
INNER JOIN employee_projects ep on ep.EmpName = emp.EmpName
INNER JOIN cte on 1=1
LEFT JOIN employee_active_on_project e on cte.oneDay between e.StartOfProject and e.EndOfProject and emp.EmpName = e.EmpName and e.ProjectName =  ep.ProjectName
GROUP BY emp.EmpName,ep.projectName,CASE WHEN e.EmpName IS NOT NULL THEN 1 ELSE 0 END,DayOfMon

SELECT projectname,EmpName
[1],  [2],  [3],  [4],
[5],  [6],  [7],  [8],
[9],  [10], [11], [12],
[13], [14], [15], [16],
[17], [18], [19], [20],
[21], [22], [23], [24],
[25], [26], [27], [28],
[29], [30],[31]
FROM
(
    SELECT
        EmpName,
        ProjectName,
        IsActive,
        DayOfMon
    FROM result
) 
as SourceTable
PIVOT
(
SUM(isactive)
For DayOfMon in ([1], [2], [3], [4],
                [5], [6], [7], [8],
                [9], [10], [11], [12],
                [13], [14], [15], [16],
                [17], [18], [19], [20],
                [21], [22], [23], [24],
                [25], [26], [27], [28],
                [29],[30],[31])
) as PivotTable;

这仅提供输出(出于空间原因显示月份的一半):

+-------------+---------+---+---+---+---+---+---+---+---+---+----+----+----+----+----+----+
| projectname | EmpName | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
+-------------+---------+---+---+---+---+---+---+---+---+---+----+----+----+----+----+----+
| projectx    | john    | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |  1 |  1 |  1 |  1 |  1 |  1 |
| projecty    | john    | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |  0 |  0 |  0 |  0 |  0 |  0 |
| projectz    | jane    | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |  1 |  1 |  1 |  1 |  1 |  1 |
+-------------+---------+---+---+---+---+---+---+---+---+---+----+----+----+----+----+----+