【问题标题】:PostgreSQL cross tab with three columns with values summed from one column具有三列的 PostgreSQL 交叉表,其值从一列求和
【发布时间】:2012-01-15 14:41:01
【问题描述】:

我是 SQL 新手,正在尝试在 Postgres 中做交叉表。我会在 Excel 中完成,但我有一个包含大约 350 万行的数据库、20,000 个不同的代码值、cat 中的 7 个类别以及从 1 到 100 的变量值。代码可能只有 7 个类别中的几个。

Excel不能处理行数,所以是SQL。

我的数据格式为

code   |  cat        |   value |
--------------------------------
abc123 |   1         |    4    |
abc234 |   2         |    6    |
abc345 |   1         |    1    |
abc123 |   3         |    2    |
abc123 |   6         |    12   |

code 和 cat 作为文本,值作为整数存储在 Postgres 表中。

我想对 code 和 cat 执行交叉表,并带有值的总和。我希望它在返回中显示零而不是“null”,但如果“null”是更简单的查询,那就没问题了。

所以我想要的输出是

code   |   'cat=0' | 'cat=1' | 'cat=2' | 'cat=3' | 'cat=4' | 'cat=5' | 'cat=6'|
abc123 |    25     |  0      |  3      |  500    | 250     | 42      |  0     |
abc234 |     0     |  100    |  0      |   10    |  5      |  0      |   25   |
abc345 |    1000   |   0     |  0      |    0    |  0      |  0      |   0    |

我在 Postgres 帮助文件和其他论坛上搜索过;最接近的是 SO question PostgreSQL Crosstab Query 但我不知道如何对第三列的值求和。

任何帮助将不胜感激。

【问题讨论】:

  • 你有什么事情吗? ;)
  • 只是沮丧.. 尝试了许多站点的许多示例。即使做简单的交叉表,我得到 42601 错误.. 类型不匹配
  • 是的,但到目前为止你尝试过什么?

标签: sql postgresql crosstab


【解决方案1】:

我通过将代码更新为以下内容来实现此功能:

select * from crosstab(
'select code, cat, sum(value) as value
 from my_table 
 group by code, cat
 order by 1,2'
) as ct(code varchar(255),
    cat_0 bigint,
    cat_1 bigint, 
    cat_2 bigint, 
    cat_3 bigint, 
    cat_4 bigint, 
    cat_5 bigint, 
    cat_6 bigint)

通过在交叉表内运行 select 语句并将我的 as ct 数据类型与交叉表内查询返回的数据类型匹配,我能够确定正确的数据类型。

【讨论】:

  • 我注意到列名 cat_XX 可以是随机的,postgres 不匹配它们... :(
  • @Chris 如果您需要订单,您可以试试这个 - SELECT * FROM crosstab(' your query ' ,$$VALUES ('cat_xx'::text), ('cat_xx2'::text) $ $)
【解决方案2】:

试试:

select * from crosstab(
'select code, cat, sum(value) as value
 from my_table 
 group by code, cat
 order by 1,2'
) as ct(code text,
        cat_0 int,
        cat_1 int, 
        cat_2 int, 
        cat_3 int, 
        cat_4 int, 
        cat_5 int, 
        cat_6 int)

【讨论】:

  • 谢谢..我试过了,但得到这个错误....错误:无效的返回类型详细信息:SQL rowid 数据类型与返回的 rowid 数据类型不匹配。 ********** 错误 ********** 错误:无效的返回类型 SQL 状态:42601 详细信息:SQL rowid 数据类型与返回的 rowid 数据类型不匹配。
  • 用 count(value) 尝试过,在 'cat_0' 之后使用 text 而不是 int 等等。仍然以同样的错误结束:sql state: 42601
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2021-12-23
  • 2019-05-18
相关资源
最近更新 更多