在 SQL 中,数据通常可以用表示单个记录的行和包含特定属性的列来构造。然而,在某些情况下,有必要将行转换为列,这一过程称为转置。在本文中,我们将探索一种使用 PostgreSQL 将行转为列的解决方案。
考虑以下场景:您有两个表,一个包含对问题的回答,另一个包含问题的答案包含实际问题。目标是转置数据,以便每个用户都有一行代表他们对所有问题的回答。
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
为了转置数据,我们将结合使用 JOIN 和 MAX() 以及 CASE 表达式。查询如下:
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
1. JOIN: JOIN 操作根据公共 Question_id 列在 RESPONSES 和 QUESTIONS 表之间建立关系。这使我们能够将响应与相应的问题配对。
2. MAX() with CASE: MAX() 函数用于聚合正文列,仅考虑每个用户和问题组合的最大值。 MAX() 中的 CASE 表达式充当条件语句,检索特定问题的正文值,如果不满足条件,则检索 NULL。
3. GROUP BY: GROUP BY 子句按 user_id 列对结果进行分组。这可确保输出中的每一行代表一个唯一的用户。
提供的 SQL 查询有效地将行转置为列,使您可以轻松提取用户对一组问题的响应。这种技术通常称为数据透视,通常用于数据分析和报告。通过利用 JOIN、MAX() 和 CASE 结构以及 GROUP BY,您可以在 SQL 中实现强大的数据转换。
以上是如何使用 PostgreSQL 将 SQL 行转置为列?的详细内容。更多信息请关注PHP中文网其他相关文章!