postgresql - 像 excel 一样创建 Postgres Pivot

标签 postgresql pivot

我需要有关创建数据透视表的帮助。我已经在这里尝试了许多提供的解决方案,但我被卡住了。希望有人能帮忙。这是我的场景:

表 1 示例

ID              text    2712cb957
document_key    text    201808

表 2 示例

ID          text    2712cb957
amount_net  int     56000
classid     int     4021

Table3(通过内部连接 ​​ID 从 Table1 和 Table2)
document_key amount_net classid

201808          10          4021
201808          10          4021
201808          15          4023
201808          13          4023
201807          20          4021
201807          15          4021
…               …           …

预期数据透视表

document_key    4021    4023
201807          35      0
201808          20      28

enter image description here

最佳答案

demo:db<>fiddle

静态 枢轴可能如下所示:


Postgres 9.4+

Postgres 9.4 添加了FILTER 函数:

SELECT 
    document_key, 
    COALESCE(SUM(amount_net) FILTER (WHERE classid = 4021), 0) as "4021", -- A
    COALESCE(SUM(amount_net) FILTER (WHERE classid = 4023), 0) as "4023"
FROM test 
GROUP BY document_key
ORDER BY document_key

A:GROUP BY document_key 聚合所有 document_key 组。使用聚合函数 SUM,您可以添加所有相应的 amount_net 值。 FILTER 函数用于仅对包含 classid = XYZ 的行中的这些值求和。聚合周围的 COALESCE 使 NULL 值变为 0。

如果你想要更多列,你必须复制这行代码。


Postgres 9.3 及更低版本

SELECT 
    document_key, 
    SUM(CASE WHEN classid = 4021 THEN amount_net ELSE 0 END) as "4021", 
    SUM(CASE WHEN classid = 4023 THEN amount_net ELSE 0 END) as "4023"
FROM test 
GROUP BY document_key
ORDER BY document_key

关于postgresql - 像 excel 一样创建 Postgres Pivot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52389155/

相关文章:

ruby-on-rails - 更快地找到最后更新的时间戳

sql - T-SQL 枢轴 : One row to column name and the other to value

php - 在数据透视查询中查找最后一个 "Non-Null"值

SQL 交叉表和数据透视表

ruby-on-rails-3 - heroku pg :psql --app my-app fails with command not found

postgresql - postgresql 中的交叉表函数导致无效的内存分配请求大小

python - 使用全栈 Python 应用程序打包数据库

python-3.x - 使用 psycopg2 将 git 修订散列 (SHA-1) 写入 PostgreSQL 数据库

pandas - 如何在 pandas 中使用数据透视表处理大块数据

sql - 在sql server中透视固定的多列表