所以我有一个最短和最长日期表,如下所示:
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
...
答案 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;