比较蓝表和绿表的数据结果,Event_1 的值似乎是分配给“当地假日”的天数。
如果“本地假期”仅等于一天,并且所有“本地假期”记录适用于假期与假期重合的任何用户,那么 Gordon 的解决方案有效(我喜欢他摆脱子查询的方式)。
但是,您可能需要解决其他问题。
根据您的数据结果,在假期期间发生当地假期的每个用户都有单独的记录表明这一点,这意味着每个用户是否存在假期记录很重要。如果是这样,请为 [User Ud] 添加一个附加联接。
LEFT JOIN plann.Events e2 ON e2.Event_Id = 1
AND e2.StartDate BETWEEN e1.StartDate AND e1.EndDate
AND e2.[User Ud] = e1.[User Ud]
如果没有 [User Ud] 加入,如果用户 22 在其休假时间内有假期,则该假期被识别——但他的数据结果与其他人相比不一致,因为他没有分配给他的记录Event_Id = 1。
使用 [User Ud] 加入,您可以获得一致的结果,但这会导致设计问题和限制。
假设“本地假期”适用于所有用户(典型)。如果是这样,我建议创建一个单独的假期表。访问适用日期的表格可确保为具有适用假期日期范围的所有用户识别所有假期。
我修改了脚本,删除了假期总是一天的假设(加拿大、英国和其他国家/地区连续有两个公共假期)。这种考虑使我重新使用子查询。
SELECT
e1.[User Ud],
e1.Event_Id,
e1.Event,
e1.StartDate,
e1.EndDate,
CASE
WHEN e1.Event_Id = 1
THEN 0
WHEN e2.[User Ud] IS NOT NULL
THEN Number_Days
ELSE 0
END AS Holiday_Nmbr_Days,
WorkingDays
FROM plann.Events e1
LEFT JOIN
(SELECT
[User Ud],
DATEDIFF(dd,StartDate,EndDate) + 1 AS Number_Days,
StartDate
FROM plann.Events
WHERE Event_Id = 1) AS e2 ON e2.Startdate BETWEEN e1.Startdate AND e1.EndDate
AND e2.[User Ud] = e1.[User Ud] /*Exclude if not applicable*/