我需要使用输入月份和年份动态创建一个月的天数。 我有一个项目表,可以保存项目开始日期和结束日期。 我也有可以在许多项目中工作的员工。
我必须找到的场景如下
如果我的输入是年份= 2015年和月份= 04
===============================================
Empname 01 02 03 --- 31
===============================================
emp1 Active project end
===============================================
我必须找出一名员工是否与该员工有关 特别的一天。我该怎么做?
答案 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 |
+-------------+---------+---+---+---+---+---+---+---+---+---+----+----+----+----+----+----+