Postgres 根据列值将行转置为列

Posted

技术标签:

【中文标题】Postgres 根据列值将行转置为列【英文标题】:Postgres Transpose Rows to Columns Based on Column Value 【发布时间】:2021-06-02 03:17:14 【问题描述】:

我在 Postgres 中有以下 statement 表:

stock |  year | statement    | amount           

ACME  | 2003  | Q1 Earnings  | 100
ACME  | 2003  | Q2 Earnings  | 200
ACME  | 2004  | Q2 Earnings  | 300 

如何制作一张新表,将一年的所有 4 个季度全部放在一行中?以及缺失语句的空值。

stock | year | Q1 Earnings | Q2 Earnings | Q3 Earnings | Q4 Earnings 

ACME  | 2003 | 100         | 200         | Null        | Null
ACME  | 2004 | NULL        | 300         | Null        | Null

找到了这个答案:Postgres - Transpose Rows to Columns,但它没有显示如何根据另一个值创建和填充新列或处理空值。

【问题讨论】:

【参考方案1】:

假设您每年要显示固定的 4 个季度,请使用旋转逻辑:

SELECT
    stock,
    year,
    MAX(amount) FILTER (WHERE statement = 'Q1 Earnings') AS "Q1 Earnings",
    MAX(amount) FILTER (WHERE statement = 'Q2 Earnings') AS "Q2 Earnings",
    MAX(amount) FILTER (WHERE statement = 'Q3 Earnings') AS "Q3 Earnings",
    MAX(amount) FILTER (WHERE statement = 'Q4 Earnings') AS "Q4 Earnings"
FROM statement
GROUP BY
    stock,
    year;

【讨论】:

谢谢。这会自动处理 NULL 值吗? 如果给定的股票和年份没有某个季度的数据,那么在这种情况下,上面只会报告NULL。如果需要,您可以使用COALESCE 显示一些备份值。

以上是关于Postgres 根据列值将行转置为列的主要内容,如果未能解决你的问题,请参考以下文章

SQL 将行转置为列

Tsql 将行转置为列,按列分组

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

SQL Server JSON 将行转置为列

SQL将行转置为列(按键变量分组)?

将行转置为不聚合的列