SQL-基于一组CASE语句将多行折叠为一行

SQL-基于一组CASE语句将多行折叠为一行,sql,postgresql,Sql,Postgresql,在SQL查询中,如何将一组结果折叠成一行,其中每个结果都是特定的案例的产物?当然,我的例子将有助于说明我想问的问题 我正在对一个Postgres表运行一个查询,该表返回多组调查答案-调查很短,只有4个问题,每个问题都有一个唯一的问题id-由于可以提交多个调查,问题id字段本身并不强制唯一性,并且将具有重复值,其中每组重复值表示一个完整的调查响应。例如,下面是调查的答案: question_id | answer ---------------------------- a

在SQL查询中,如何将一组结果折叠成一行,其中每个结果都是特定的
案例的产物
?当然,我的例子将有助于说明我想问的问题

我正在对一个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()工作得很好。