我有两张桌子.一份用于测试记录,一份用于测试前问卷. 我想从我的测试记录表中进行 Select ,并有一栏是"测试前问卷已完成?"它将包含是或否

调查问卷必须在进行测试前12个月内进行记录.因此,如果我在2023年1月1日做一份问卷调查,并在2023年10月1日做一次测试,结果将是"预测问卷已完成?"一栏.如果反过来,我和我在2023年1月1日做了一次测试,在2023年10月1日做了一份问卷调查,我希望结果是否定的,因为问卷没有在测试的12个月内记录下来.

这些表通过PersonID连接.

表:记录的测试

Person Test Date
1111 01/01/2023
2222 05/01/2023
3333 10/01/2023

表:问卷记录

Person Q Date
1111 10/12/2022
2222 20/05/2023

所需输出将为:

Person Q Date Q'nnaire completed in last 12months?
1111 10/12/2022 Yes
2222 20/05/2023 No
3333 10/01/2023 No

期望的输出,因为1111人在测试前完成了问卷调查,其他2人则没有.

值得注意的是,一个人可以有几份问卷和测试.

如果有人能够帮助我为SELECT中的附加列提供正确的JOIN/CASE语句,那就太好了.我try 了这么多不同的DateAdd/Datediff,但都无法实现逻辑.

谢谢

**编辑:

我正在使用SQL Server.以下是我try 过的查询:

SELECT wt.[WalkTestPK]
      ,wt.[PersonID]
      ,wt.[CompletionDate]
      , case 
      when (Q.[Completion time]) >= dateadd(day,365,wt.[CompletionDate]) then 'yes'
      else 'no'
      end as [Was a questionnaire completed within 12 months prioir to this test?]
      FROM [WalkTests] wt
  left join Questionnaires Q on Q.[Service Number] = wt.PersonID

关于多次测试和问卷调查的一些澄清--个人被要求每年做两次测试.一份问卷应在考试前填写,有效期为12个月,因此一份问卷应涵盖两次考试.我想要做的是从我的测试表中 Select 数据并查询调查问卷表,以查看是否在测试前12个月内填写了调查问卷.

总之,如果调查问卷表中存在已在测试表中进行测试的PersonID的记录,我想知道调查问卷表中的记录是否在测试日期之前的12个月内.

希望这能帮上忙.

推荐答案

如果调查问卷表中存在已在测试表中进行测试的PersonID的记录,我想知道调查问卷表中的记录是否在测试日期之前的12个月内.

这是最简单的情况:您只想知道whether每个测试都有一个相关的调查问卷,所以您的输出就是yes/no.您只需加入您实际想要统计的问卷,如果测试有,则回答是,如果测试没有,则回答否(null).因为可能有多个匹配的调查问卷,所以您可以避免使用DISTINCT(或GROUP BY,但我很懒)来分散行

select distinct T.WalkTestPK
    , T.PersonID
    , T.CompletionDate
    , [Questionnaire within 12 months] = iif(Q.ID is null, 'No', 'Yes')
from WalkTests T
    left join Questionnaires Q on Q.[Service Number] = T.PersonID
                              and Q.[Completion Time] >= dateadd(year, -1, T.CompletionDate)

如果您需要从调查问卷表中输出完成日期,您的结果行将分布.要避免这种情况,请使用group by和输出max(Q.[Completion Time])来显示最新匹配的调查问卷.

如果你需要从问卷中输出更多的信息,而不仅仅是最新的日期,你可以使用订购的outer apply.这将为您提供每人最新调查问卷中的所有列(如果1年内没有任何列,则为null列):

select T.WalkTestPK
    , T.PersonID
    , T.CompletionDate
    , [Questionnaire within 12 months] = iif(Q.Id is null, 'No', 'Yes')
    , Q.[Completion Time]
    , Q.ShoeSize
    , Q.Whatever
    , Q.SomeOtherColumn
from WalkTests T
    outer apply (select top 1 *
                 from Questionnaires Q
                 where Q.[Service Number] = T.PersonID
                     and Q.[Completion Time] >= dateadd(year, -1, T.CompletionDate)
                 order by Q.[Completion Time] desc) Q

(请注意,我只是干巴巴地写这篇文章,没有准备好测试数据,可能存在语法错误或其他错误)

Sql相关问答推荐

PG SQL中按条件聚合值

如何在幂函数中正确使用Power()和Exp()

在请求结束之前,PostgreSQL不会考虑使用中的删除

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

是否可以为表中的所有列生成散列值?

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

SQL按日期分组字段和如果日期匹配则求和

以一致的价值获得独特的价值

按属性值 Select 数组元素Postgres Jsonb

如何在Postgres中为单值输入多行?

Proc SQL Select Distinct SAS

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

显示所有组并计算给定组中的项目(包括 0 个结果)

在 SQL Server 中合并两个 XML 列

如何计算两个非周期性时间序列+分组的重叠持续时间

SQL Server:时态表并在运行时添加计算列

创建定时器以更新Gridview

存储过程 - 动态 SQL 中不同列值的计数

SQL查询以获取从特定可变日期看到的用户

从不同的表中 Select 包含单词列表的记录