sql - 获取缺少答案的调查问卷列表

标签 sql sql-server sql-server-2012 subquery

这不是一个很好的标题(欢迎编辑),但这里有一个摘要。我当前的查询工作正常,但可能有比我当前使用的更简单的方法。我有一个表“答案”,其中包含“QuestionIDFK、答案、QuestionnaireIDFK”列。表中的数据类似于

QuestionIDFK    Answer    QuestionnaireIDFK
1               N         1
2               N         1
3               N         1
1               Y         2
2               Y         2
3               Y         2
1               N         3
3               N         3
1               Y         4
3               Y         4

这意味着用户为问卷 1 和 2 提供了问题 2 的答案,但没有为问卷 3 和 4 的问题 2 提供答案。我需要的是没有答案的问卷 ID 列表对于问题 2。所以预期输出是

QuestionnaireWithMissingAnswer2
3
4

我正在使用下面的这个查询,它工作正常,但我想知道是否有更简单的方法:

SELECT distinct a.QuestionnaireIDFK AS QuestionnaireWithMissingAnswer2 
FROM Answer a
inner join (
SELECT t.QuestionnaireIDFK,
       STUFF(ISNULL((SELECT ', ' + convert(nvarchar, x.QuestionIDFK)
                FROM Answer x
                WHERE x.QuestionnaireIDFK = t.QuestionnaireIDFK
                GROUP BY x.QuestionIDFK
                FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') 
                AS QuesList
     FROM Answer t
     GROUP BY t.QuestionnaireIDFK) z 
ON z.QuestionnaireIDFK = a.QuestionnaireIDFK AND z.QuesList NOT LIKE '%2%'

最佳答案

您只需将 not containsgroup byhaving 子句一起使用即可:

select QuestionnaireIDFK
from answer
group by QuestionnaireIDFK
having sum(case when QuestionIDFK = 2 then 1 else 0 end) = 0;

这将获取所有没有问题 #2 的调查问卷(至少所有有一些答案的调查问卷)。

您还可以使用 not contains (或 左外连接)来执行此操作:

select distinct QuestionnaireIDFK
from answer
where not exists (select 1
                  from answer a2
                  where a.QuestionnaireIDFK = a2.QuestionnaireIDFK and
                        a2.QuestionIDFK = 2
                 );

但是,由于不同,这不太可能比第一种方法具有更好的性能。

关于sql - 获取缺少答案的调查问卷列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27601334/

相关文章:

sql-server - UTF-8支持,SQL Server 2012和UTF8String UDT

sql - lucene vs sql 结果评分

mysql - sql中一对列的重复数

sql - 日期和季度 SQL ORACLE

sql - 在 MySQL 中盲目使用 INSERT 有缺点吗?

c# - 使用 C# 将多个值传递给 SQL 内联查询中的单个参数

sql - 如何将复杂的关系数据从Excel导入到SQL Server

c# - 如何让EF高效调用聚合函数?

sql-server-2008 - 如何在没有 Management Studio 的情况下更改 SQL Server 授权模式

c# - 如何将任意 XML 转换(分解)为平面数据结构?