这不是一个很好的标题(欢迎编辑),但这里有一个摘要。我当前的查询工作正常,但可能有比我当前使用的更简单的方法。我有一个表“答案”,其中包含“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 contains
或 group by
与 having
子句一起使用即可:
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/