如何在PostgreSQL中进行数据透视

如何在PostgreSQL中进行数据透视,postgresql,pivot,postgresql-9.1,Postgresql,Pivot,Postgresql 9.1,我是PostgreSQL的新手 假设我有一张桌子在下面 colorname Hexa rgb rgbvalue Violet #8B00FF r 139 Violet #8B00FF g 0 Violet #8B00FF b 255 Indigo #4B0082 r 75 Indigo #4B0082 g 0 Indigo #4B0082 b 130 Blue #0000FF r 0 Blue #0000FF g 0 Blue

我是PostgreSQL的新手

假设我有一张桌子在下面

colorname   Hexa    rgb rgbvalue
Violet  #8B00FF r   139
Violet  #8B00FF g   0
Violet  #8B00FF b   255
Indigo  #4B0082 r   75
Indigo  #4B0082 g   0
Indigo  #4B0082 b   130
Blue    #0000FF r   0
Blue    #0000FF g   0
Blue    #0000FF b   255
如果我在SQL Server中作为

SELECT colorname,hexa,[r], [g], [b]
FROM
(SELECT colorname,hexa,rgb,rgbvalue
    FROM tblPivot) AS TableToBePivoted
PIVOT
(
sum(rgbvalue)
FOR rgb IN ([r], [g], [b])
) AS PivotedTable;
我得到的输出是

colorname   hexa    r   g   b
Blue    #0000FF 0   0   255
Indigo  #4B0082 75  0   130
Violet  #8B00FF 139 0   255
如何使用PostgreSQL实现同样的功能

我的尝试是

SELECT *
FROM crosstab
(
    'SELECT 
        colorname
        ,hexa
        ,rgb
        ,rgbvalue
    FROM tblPivot'
)AS ct(colorname text, hexa text, rgb text, rgbvalue int);
但是获取错误:

ERROR:  function crosstab(unknown) does not exist
LINE 2: FROM crosstab
             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
********** Error **********
ERROR: function crosstab(unknown) does not exist**

PostgreSQL(任何内置函数…)中是否有任何优雅的方法可以这样做?标准做法是什么?

这可以表示为连接:

SELECT c.colorname, c.hexa, r.rgbvalue, g.rgbvalue, b.rgbvalue
FROM (SELECT colorname, hexa
      FROM sometable
      GROUP BY colorname) c
JOIN sometable r ON c.colorname = r.colorname AND r.rgb = 'r'
JOIN sometable g ON c.colorname = g.colorname AND g.rgb = 'g'
JOIN sometable b ON c.colorname = b.colorname AND b.rgb = 'b'
;
运行这个

CREATE EXTENSION tablefunc;

并尝试执行查询

,但为什么交叉表不起作用。。。它在我使用的当前版本中不支持吗?
crosstab()
属于
tablefunc
模块。您必须使用
CREATE EXTENSION
启用它。也就是说;它提供的便利可能并没有那么大;postgresql非常擅长优化连接,这种代码在更多的数据库和开发人员中更容易识别。如果你做了很多交叉表的工作,tablefunc contrib模块会很棒。如果你在Ubuntu上,你可以通过以下方式将tablefunc函数添加到数据库中:psql dbname-f/usr/share/postgresql/8.4/contrib/tablefunc.sql或类似的东西。我“认为”第一行应该是“选择c.colorname、c.hexa、r.rgbvalue、g.rgbvalue、b.rgbvalue”,否则这个答案+1“tablefunc”已经存在,但当我尝试使用它时,我得到了错误:函数交叉表(未知)不存在。我正在Mac 10.9.2上使用Postgres 9.2.1。有什么想法吗?请确保您使用\c db_名称连接到数据库,然后运行上面的命令。这已经回答了@Black评论中提出的问题。