SQL-基于一组CASE语句将多行折叠为一行
在SQL查询中,如何将一组结果折叠成一行,其中每个结果都是特定的SQL-基于一组CASE语句将多行折叠为一行,sql,postgresql,Sql,Postgresql,在SQL查询中,如何将一组结果折叠成一行,其中每个结果都是特定的案例的产物?当然,我的例子将有助于说明我想问的问题 我正在对一个Postgres表运行一个查询,该表返回多组调查答案-调查很短,只有4个问题,每个问题都有一个唯一的问题id-由于可以提交多个调查,问题id字段本身并不强制唯一性,并且将具有重复值,其中每组重复值表示一个完整的调查响应。例如,下面是调查的答案: question_id | answer ---------------------------- a
案例的产物
?当然,我的例子将有助于说明我想问的问题
我正在对一个Postgres表运行一个查询,该表返回多组调查答案-调查很短,只有4个问题,每个问题都有一个唯一的问题id
-由于可以提交多个调查,问题id
字段本身并不强制唯一性,并且将具有重复值,其中每组重复值表示一个完整的调查响应。例如,下面是调查的答案
:
question_id | answer
----------------------------
a | 10
b | foo
c | 9
d | bar
a | 2
b | baz
c | 4
d | zip
理想情况下,我希望能够查询/处理此结果,甚至将其进一步转换为输出,其中每组结果都折叠成一行:
score_1 | reason_1 | score_2 | reason_2
----------------------------------------------
10 | foo | 9 | bar
2 | baz | 4 | zip
然而,我不太擅长SQL,我不能很好地实现这一点。我能得到的最接近的结果是使用以下查询:
SELECT
CASE WHEN survey_answers.question_id = 'a' THEN survey_answers.answer END AS score_1,
CASE WHEN survey_answers.question_id = 'b' THEN survey_answers.answer END AS reason_1,
CASE WHEN survey_answers.question_id = 'c' THEN survey_answers.answer END AS score_2,
CASE WHEN survey_answers.question_id = 'd' THEN survey_answers.answer END AS reason_2
FROM survey_answers
但这会生成一个表,其中每个结果都在它自己的行上(我对这个结果并不感到惊讶——只是不知道如何将它放入我所寻找的内容中):
如何查询调查\u答案
,以便将每个组折叠成一行?SQL表表示无序集。除非列指定排序,否则没有排序。不过,您真正需要的不是排序,而是指定一组特定答案的列。让我们称之为响应者id
然后,您可以使用聚合:
SELECT sa.responder_id,
MAX(CASE WHEN sa.question_id = 'a' THEN sa.answer END) AS score_1,
MAX(CASE WHEN sa.question_id = 'b' THEN sa.answer END) AS reason_1,
MAX(CASE WHEN sa.question_id = 'c' THEN sa.answer END) AS score_2,
MAX(CASE WHEN sa.question_id = 'd' THEN sa.answer END) AS reason_2
FROM survey_answers sa
GROUP BY sa.reponder_id;
SQL表表示无序集。除非列指定排序,否则没有排序。不过,您真正需要的不是排序,而是指定一组特定答案的列。让我们称之为响应者id
然后,您可以使用聚合:
SELECT sa.responder_id,
MAX(CASE WHEN sa.question_id = 'a' THEN sa.answer END) AS score_1,
MAX(CASE WHEN sa.question_id = 'b' THEN sa.answer END) AS reason_1,
MAX(CASE WHEN sa.question_id = 'c' THEN sa.answer END) AS score_2,
MAX(CASE WHEN sa.question_id = 'd' THEN sa.answer END) AS reason_2
FROM survey_answers sa
GROUP BY sa.reponder_id;
您只需聚合每一个-
max(case-when…
)或一行中每一列的一个子选择而不使用from您只需聚合每一个-max(case-when…
)或一行中每一列的一个子选择而不使用from,非常感谢-我能够在生成survey\u回复的初始查询结果中包含responder\u id
列,因此我可以使用该列来处理分组。否则,MAX()工作得很好。太好了,非常感谢您-我能够在生成调查响应的初始查询结果中包含响应者id
列,因此我可以使用该列来处理分组。否则,MAX()工作得很好。