首页 > 数据库 > mysql教程 > 如何使用 PostgreSQL 将 SQL 行转置为列?

如何使用 PostgreSQL 将 SQL 行转置为列?

Mary-Kate Olsen
发布: 2024-12-31 19:44:10
原创
848 人浏览过

How to Transpose SQL Rows into Columns Using PostgreSQL?

将 SQL 行转换为列:综合指南

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板