【问题标题】:Create Postgres Pivot like excel像 excel 一样创建 Postgres Pivot
【发布时间】:2018-09-19 16:46:58
【问题描述】:

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

Table1 示例

ID              text    2712cb957
document_key    text    201808

Table2 示例

ID          text    2712cb957
amount_net  int     56000
classid     int     4021

Table3(来自 Table1 和 Table2,通过内部连接 ​​ID)
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

【问题讨论】:

  • sry,这是我在这里的第一篇文章。请点击图片链接了解详情。谢谢
  • 你提前知道你只想要40214023吗?或者这是否会基于您的表中存在的许多不同的classid 是动态的?
  • 嗨,会有更多的类 id,所以是的,这应该是动态的
  • 不用担心所有这些的格式。要保留您的空格和换行符,只需将表格/代码的每一行缩进 4 个空格。您还可以突出显示该块并点击编辑器顶部的{} 按钮。为了做到这一点,我已经对这个问题进行了编辑。
  • Postgres 中的动态枢轴一点也不简单。有一个很棒的write up at this question,尽管它会引导您了解crosstab 关键字、如何应用它以及制作动态内容所需的步骤。这是您要么深入研究函数,要么动态生成交叉表/数据透视查询然后执行动态生成的 sql 的事情之一。

标签: postgresql pivot


【解决方案1】:

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

答: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

【讨论】:

  • 谢谢,您的示例在第一次出现 FILTER 时引发语法错误
  • 你用的是哪个版本?
  • 我们使用的是 9.3
  • 您应该真正升级您的数据库,因为不再支持 9.3。你会错过许多非常棒的功能。尽管如此:添加了更兼容的枢轴版本并更新了小提琴
  • 我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2017-10-28
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多