查询以仅在一个日期中获取具有多个会话的实体?

时间:2019-02-04 23:11:47

标签: sql sql-server tsql

我正试图编写一个查询来捕获在一个日期中有多个班次但具有开始日期和结束日期查询的雇员。

例如,我传入了两个变量:startDate = 1/14和endDate = 1/20。

如果雇员Paul在1/18有两次轮班,我想抓住他。如果特里在1/17上有一个变速,请不要抓住他。如果保罗在1/19上也有两个班次,那么他应该出现在4行中,每个班次一个。

这是我到目前为止形成的查询的基础

SELECT e.EmployeeID
   ,s.ShiftID
   ,s.ShiftDate
   ,s.ShiftType
FROM Employee e
JOIN Shift s ON s.EmployeeId = e.EmployeeId AND (s.Date >= @startDate AND s.Date <= @endDate)
--This is the part I'm struggling with and is wrong somehow
WHERE (
        SELECT COUNT(s2.ShiftId)
        FROM Shift s2
        WHERE s2.EmployeeId = e.EmployeeId AND s2.Date = s.Date AND s2.ShiftType IN ('TypeA', 'TypeB')
) > 1)
    AND s.ShiftType IN ('TypeA', 'TypeB')

有人可以帮助我吗?我的WHERE过滤器某种程度上是错误的,但是它的基础是我只尝试在两个日期参数中的同一天获取具有多个班次的条目。我将如何制定此查询,我走在正确的轨道上了吗?我希望这能起作用,但是我在结果中看到一个条目,即某人在1/14中只有一个条目,并且仍然出现在我的列表中。

2 个答案:

答案 0 :(得分:2)

我不明白为什么需要任何汇总。您只需要在同一天为同一名员工寻找另一个轮班:

SELECT s.*
FROM Shift s 
WHERE s.Date >= @startDate AND
      s.Date <= @endDate AND
      s.ShiftType IN ('TypeA', 'TypeB') AND
      EXISTS (SELECT 1
              FROM Shift s2
              WHERE s2.EmployeeId = s.EmployeeId AND
                    s2.Date = s.Date AND
                    s2.ShiftType IN ('TypeA', 'TypeB') AND
                    s2.ShiftId <> s.ShiftId
             );

请注意,外部查询或子查询中均不包括employee表。您可能在外部查询中需要它。我在子查询中看不到任何目的。

答案 1 :(得分:1)

您可以将“ WHERE EXISTS”用于以下查询:

SELECT e.EmployeeID
   ,s.ShiftID
   ,s.ShiftDate
   ,s.ShiftType
FROM Employee e
JOIN Shift s ON s.EmployeeId = e.EmployeeId 
    AND (s.Date >= @startDate AND s.Date <= @endDate)
WHERE EXISTS (
    SELECT 1
    FROM Shift s2
    WHERE s2.EmployeeId = s.EmployeeId 
        AND s2.Date = s.Date
    GROUP BY s2.EmployeeId, s2.Date
    HAVING COUNT(*) > 1
)

您还可以运行此查询以仅查看Shift记录(以上EXISTS查询所基于的记录):

SELECT 
    s.EmployeeId, s.Date, COUNT(*)
FROM Shift s
GROUP BY s.EmployeeId, s.Date
HAVING COUNT(*) > 1