【问题标题】:T-SQL Query using table rows使用表行的 T-SQL 查询
【发布时间】:2016-01-20 07:33:35
【问题描述】:

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

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 都查询下一个 y),我不知道要查找什么来寻找这样的事情,任何帮助都会很棒!

为清晰而编辑

员工数据将来自 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
...

【问题讨论】:

  • empname 是否始终只是“emp”和 empnum 的连接?
  • 由于缺乏实际日期,病假从何而来?是 max 和 mindate 的区别吗?
  • 员工数据是什么样的?例如,结果表中的 sickdays 列 a 也是 Employee 表中的列吗?或者是否有另一个表通过 empId 和 sickdays 跟踪病假,结果是第一个表的最小值和最大值之间的总和。
  • 为了清楚起见查看编辑

标签: sql-server


【解决方案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;

【讨论】:

  • 我认为这为我指明了正确的方向并让我继续前进,谢谢!
【解决方案2】:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多