PostgreSQL交叉表,带有三列,值从一列汇总

时间:2012-01-15 14:41:02

标签: sql postgresql crosstab

我是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   |

将代码和cat作为文本,将值作为存储在Postgres表中的整数。

我想在代码和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问题PostgreSQL Crosstab Query,但我无法弄清楚如何对第三列的值求和。

非常感谢任何协助。

2 个答案:

答案 0 :(得分:7)

我通过将代码更新为以下代码来实现此目的:

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语句并将我的ct数据类型与交叉表内查询返回的数据类型相匹配来确定正确的数据类型。

答案 1 :(得分:3)

尝试:

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)