SQL Server:关联两表实现测试前12个月问卷完成校验
修正后的SQL查询方案
原查询存在两个核心问题:
- 时间判断逻辑完全颠倒,问卷日期应该落在测试日期的前12个月区间内,而非测试日期加365天后
- 直接LEFT JOIN会因用户多条问卷/测试记录产生重复行,需改用存在性判断避免冗余
正确查询语句
SELECT wt.[WalkTestPK], wt.[PersonID], wt.[CompletionDate], CASE WHEN EXISTS ( SELECT 1 FROM Questionnaires q WHERE q.[Service Number] = wt.PersonID -- 若Questionnaires表关联字段是PersonID,替换为q.PersonID = wt.PersonID AND q.[Completion time] >= DATEADD(month, -12, wt.CompletionDate) AND q.[Completion time] <= wt.CompletionDate ) THEN 'Yes' ELSE 'No' END AS [是否在测试前12个月内完成预测试问卷] FROM [WalkTests] wt ORDER BY wt.[WalkTestPK];
关键修正点说明
- 时间逻辑修正:用
DATEADD(month, -12, wt.CompletionDate)计算测试日期往前推12个月的起始点,判断问卷日期是否在[起始点, 测试日期]区间内(用month而非day更准确,规避闰年366天的误差) - 避免重复行:使用
EXISTS子查询判断当前测试记录是否存在符合条件的问卷,确保每条测试记录仅返回一行结果 - 字段名校验:请确认Questionnaires表的关联字段,若实际是
PersonID而非[Service Number],需同步修改关联条件
内容的提问来源于stack exchange,提问作者Lloyd Thomas
相关产品推荐
相关产品推荐

