我有一个有趣的难题,我相信可以用纯SQL来解决。我有类似于以下表格:

responses:

user_id | question_id | body
----------------------------
1       | 1           | Yes
2       | 1           | Yes
1       | 2           | Yes
2       | 2           | No
1       | 3           | No
2       | 3           | No


questions:

id | body
-------------------------
1 | Do you like apples?
2 | Do you like oranges?
3 | Do you like carrots?

我想得到以下输出
user_id | Do you like apples? | Do you like oranges? | Do you like carrots?
---------------------------------------------------------------------------
1       | Yes                 | Yes                  | No
2       | Yes                 | No                   | No

我不知道会有多少个问题,它们是动态的,所以我不能只为每个问题编写代码。我使用的是PostgreSQL,我相信这称为转置,但是我似乎找不到任何能说明在SQL中执行此操作的标准方法的内容。我记得我上大学时在数据库类(class)中这样做,但是那是在MySQL中进行的,老实说我不记得我们是如何做到的。

我假设它将是联接和GROUP BY语句的组合,但我什至不知道如何开始。

有人知道该怎么做吗?非常感谢!

编辑1:我发现了一些有关使用crosstab的信息,这似乎是我想要的,但是我很难理解它。链接到更好的文章将不胜感激!

最佳答案

采用:

  SELECT r.user_id,
         MAX(CASE WHEN r.question_id = 1 THEN r.body ELSE NULL END) AS "Do you like apples?",
         MAX(CASE WHEN r.question_id = 2 THEN r.body ELSE NULL END) AS "Do you like oranges?",
         MAX(CASE WHEN r.question_id = 3 THEN r.body ELSE NULL END) AS "Do you like carrots?"
    FROM RESPONSES r
    JOIN QUESTIONS q ON q.id = r.question_id
GROUP BY r.user_id

这是标准的数据透视查询,因为您要将数据从行“透视”为列数据。

09-12 02:54