这个问题使我感到困惑。这是我的数据的简化版本:
表1:“停留”-客户从开始日期到结束日期都有“停留”
Stay ID | Client ID | Start Date | End Date 1 | 1 | 2018-01-01 | 2018-01-31 2 | 2 | 2018-01-01 | 2018-01-31 3 | 3 | 2018-01-01 | 2018-01-31 4 | 1 | 2018-03-01 | *Null* 5 | 2 | 2018-03-01 | *Null* 6 | 4 | 2018-03-01 | *Null* 7 | 5 | 2018-03-01 | *Null*
表2:“家庭”-从开始日期到结束日期,有些客户是家庭的一部分
ID | Client ID | Family ID | Start Date | End Date 1 | 1 | 1 | 2017-11-01 | 2017-11-30 2 | 2 | 2 | 2018-01-01 | 2018-01-31 3 | 3 | 2 | 2018-01-01 | 2018-01-31 4 | 1 | 3 | 2018-03-01 | *Null* 5 | 6 | 4 | 2018-01-01 | 2018-01-31
所以我在Stays上加入家庭。客户ID =家庭。客户ID。
现在这是我正在尝试做的。我正在使用Crystal Reports,并且想要在Stays表中显示所有内容。然后,如果客户在住宿时是家庭成员,我也想显示家庭ID。如果不是,我希望它显示为空。因此输出可能看起来像这样:
Stay ID | Client ID | Family ID 1 | 1 | *Null* 2 | 2 | 2 3 | 3 | 2 4 | 1 | 3 5 | 2 | *Null* 6 | 4 | *Null* 7 | 5 | *Null*
我已经尝试了许多不同类型的逻辑来尝试实现这一点。我只需要从开始日期和结束日期没有重叠的家庭中排除记录,例如,家庭记录4,但是我需要包括所有有住宿的客户,并且对于有多个家庭记录和/或多个住宿记录的客户(例如客户1),正确识别与住宿重叠的家庭。
在此先感谢您的帮助!
答案 0 :(得分:0)
您可以使用子查询来做到这一点:
SELECT
StayID
, ClientID
, StartDate
, EndDate
, FamilyID = (SELECT TOP 1 FamilyID FROM tblFamilies WHERE StartDate >= ts.StartDate AND EndDate <= ts.EndDate AND ClientID = ts.ClientID ORDER BY StayID DESC)
FROM tblStays ts ;