使用表行

时间:2016-01-19 22:50:16

标签: sql-server

所以我有一个最短和最长日期表,如下所示:

num    mindate     maxdate
1      x/xx/xxxx   x/xx/xxxx
2      x/xx/xxxx   x/xx/xxxx
3      x/xx/xxxx   x/xx/xxxx
...

现在我需要做的是在多个员工的数据查询中使用min和max中的所有值,从而为每个员工提取所有这些日期之间的所有数据。

例如,结束表如下所示:

emp#     empname     sickdays      mindate     maxdate 
0        emp1        1             x/xx/xxxx   x/xx/xxxx
0        emp1        0             x/xx/xxxx   x/xx/xxxx
1        emp2        1             x/xx/xxxx   x/xx/xxxx
1        emp2        0             x/xx/xxxx   x/xx/xxxx  
...

任何人都可以指点我甚至开始解决这个问题,我从来没有处理过(对于每个x做查询,接下来)我不知道甚至要查找这样的东西,任何帮助都会很棒!

编辑CLAIRITY

员工数据将来自2个单独的表格,并合并为一个表格,以获取员工编号,姓名,病假日数以及我需要的任何其他内容。问题是我需要为表的每个日期运行每个员工的查询,以获得每个mindate和maxdate之间的病假天数。

换句话说,每个员工每个日期范围都会有多行病假。

所以一名员工看起来像:

emp#     empname     sickdays      mindate     maxdate 
1        emp1        1             1/1/2016    1/7/2016
1        emp1        0             1/8/2016    1/14/2016
1        emp2        3             1/15/2016   1/21/2016
1        emp2        0             1/22/2016   1/29/2016
...

2 个答案:

答案 0 :(得分:1)

SELECT
e.employee_id,
COUNT(s.employee_id) sickdays,
r.mindate,
r.maxdate
FROM
employee e
CROSS JOIN report_dates r
LEFT OUTER JOIN sick_day s ON
s.employee_id = s.employee_id AND
s.effective_date BETWEEN r.mindate AND r.maxdate
GROUP BY
e.employee_id,
r.mindate,
r.maxdate;

答案 1 :(得分:1)

假设有两个表Employee和EmployeeSickTime看起来像这样

Employee
--------------------------
EmpId int NOT NULL,
EmpName varchar(100) 

EmployeeSickTime
--------------------------
EmpId int NOT NULL,
SickDate datetime NOT NULL

和给定的日期范围表

ReportRanges
--------------------------
num int NOT NULL,
MinDate datetime NOT NULL,
MaxDate datetime NOT NULL

然后此查询将提供您描述的结果。我在 SQL Fiddle 上创建了一个工作示例,其中包含您可以查看的示例数据。

SELECT e.EmpId, e.EmpName, SUM(CASE WHEN est.EmpId IS NOT NULL THEN 1 ELSE 0 END) as SickDays, r.MinDate, r.MaxDate
FROM Employee e
LEFT OUTER JOIN EmployeeSickTime est ON e.EmpId=est.EmpId
LEFT OUTER JOIN ReportRange r ON est.SickDate BETWEEN r.MinDate AND r.MaxDate
WHERE r.MinDate IS NOT NULL
GROUP BY e.EmpId, e.EmpName, r.MinDate, r.MaxDate
ORDER BY e.EmpId;