是否根据CASE表达式对结果进行分组



我正在使用一个表,该表存储对人们进行的问卷调查的结果。每个问题及其结果都存储为一个单独的记录,如下所示。我写了一个CASE表达式,它根据人们对某些问题的回答创建一个简单的1/0标志。我的结果是这样的。

PersonID    Question       Answer       Flag
---------------------------------------------
1001        Question 1     yes          1
1001        Question 2     3            0
1001        Question 3     1 or more    1
1234        Question 1     no           0
1234        Question 2     2            0
1234        Question 3     none         0

我现在的问题是,如果一个人有哪怕一个标记的回答,我需要标记他们的整个问卷。我一直在寻找这个问题的其他例子——这个正在处理几乎完全相同的事情,但我不一定想实际上将我的结果分组,因为我仍然希望能够看到单个问题的标志("哦,这个人的问卷被标记了,让我们看看是针对哪个问题的,他们的回答是什么"(。我知道这可能不是最有效的方法,但我希望能得到这样的结果:

PersonID    Question       Answer       Flag    Overall
--------------------------------------------------------
1001        Question 1     yes          1         1
1001        Question 2     3            0         1
1001        Question 3     1 or more    1         1
1234        Question 1     no           0         0
1234        Question 2     2            0         0
1234        Question 3     none         0         0

这就是我的问题所在。它可以很好地标记单个问题,但我不确定应该采取什么步骤才能根据单个答案标记整个问卷。我应该看什么样的逻辑/语法?

SELECT
PersonID,
QuestionDescription as Question,
ResultValue as Answer,
(CASE
WHEN (QuestionDescription LIKE '%ion 1%' AND ResultValue = 'yes') THEN 1
WHEN (QuestionDescription LIKE '%ion 2%' AND ResultValue >= 5) THEN 1
WHEN (QuestionDescription LIKE '%ion 3%' AND ResultValue = '1 or more') THEN 1
ELSE 0
END) as Flag
FROM Questionnaire
ORDER BY PersonID, QuestionDescription

最简单的方法是,您可以将人员分区中的标志相加,并查看它们的总和是否为0:

WITH x AS
(
SELECT
PersonID,
QuestionDescription as Question,
ResultValue as Answer,
CASE
WHEN (QuestionDescription LIKE '%ion 1%' AND ResultValue = 'yes') THEN 1
WHEN (QuestionDescription LIKE '%ion 2%' AND ResultValue >= 5) THEN 1
WHEN (QuestionDescription LIKE '%ion 3%' AND ResultValue = '1 or more') THEN 1
ELSE 0
END as Flag
FROM Questionnaire
)
SELECT 
*,
CASE WHEN SUM(Flag) OVER(PARTITION BY PersonID) > 0 THEN 1 ELSE 0 END as Overall
FROM
x

SUM(...) OVER(...)有点像执行以下操作:

WITH x AS ( 
--your existing query here
)
SELECT *, CASE WHEN SumFlag > 0 THEN 1 ELSE 0 END as OVerall
FROM
x
INNER JOIN
(SELECT PersonId, SUM(Flag) AS SumFlag FROM X GROUP BY PersonId) y ON x.PersonId = y.PersonId

即SUM OVER对PersonId进行分组,然后将结果自动连接回分组对象(PersonId(的每一行-它们是非常强大和有用的东西,这些窗口函数

如果你不能继续使用窗口函数(SUM OVER(方法,后一种形式(单独的查询分组并重新加入(也会起作用——这类似于datarocker在他们的答案中指出的内容

相关内容

  • 没有找到相关文章

最新更新