PostgreSQL交叉表/数据透视问题

PostgreSQL交叉表/数据透视问题,sql,postgresql,plpgsql,postgresql-9.1,crosstab,Sql,Postgresql,Plpgsql,Postgresql 9.1,Crosstab,我有一个prefs表,下面是相关列: mydb=> SELECT pref_id, pref_name, pref_value FROM prefs; pref_id | pref_name | pref_value ---------+--------------+---------------- 1 | PagerNumber | 2125551234 2 | PagerCarrier | @att.com 3 | PagerCa

我有一个
prefs
表,下面是相关列:

mydb=> SELECT pref_id, pref_name, pref_value FROM prefs;
 pref_id |  pref_name   |   pref_value
---------+--------------+----------------
       1 | PagerNumber  | 2125551234
       2 | PagerCarrier | @att.com
       3 | PagerCarrier | @something.com
我想制作这样的东西:

 section |  pager_number  | pager_carrier
---------+----------------+---------------
       1 | 2125551234     |
       2 |                | @att.com
       3 |                | @something.com
所以我使用了交叉表,下面是关于stackoverflow的示例:

所有值都将进入
pager\u number
,并且
pager\u carrier
为空:

 section |  pager_number  | pager_carrier
---------+----------------+---------------
       1 | 2125551234     |
       2 | @att.com       |
       3 | @something.com |
有人能看到发生了什么吗?

而不是:

SELECT row_name AS section, category_1::text AS pager_number, category_2::text
AS pager_carrier
FROM crosstab('select pref_id::bigint, pref_name::text, pref_value::text
    FROM prefs')
AS ct (row_name bigint, category_1 text, category_2 text);
尝试:

如果你有:

    pref_id |  pref_name   |   pref_value
   ---------+--------------+----------------
   1 | PagerNumber  | 2125551234
   2 | PagerCarrier | @att.com
   3 | PagerCarrier | @something.com
   2 | PageNumber   | 2332323232
   3 | PagerCarrier | @somethingelse.com
你会得到:

    row_name |  carrier_1   |   carrier_2
   -----+--------------+----------------
   1 | 2125551234      |
   2 | @att.com        | 2332323232
   3 | @something.com  | @somethingelse.com
测试用例(提供样本数据的首选方式):

查询:

SELECT *
FROM   crosstab(
       'SELECT pref_id, pref_name, pref_value
        FROM   prefs
        ORDER  BY 1, 2',

       $$VALUES ('PagerNumber'::text), ('PagerCarrier')$$
       )
AS x (section text, pager_number bigint, pager_carrier text);
返回问题中描述的结果。如果
PagerNumber
可能不是有效的
bigint
数字,请改用
text


你在问题中提到的答案已经过时,一开始就不正确。我添加了一个

谢谢,但在您的解决方案中没有差异,我得到了相同的结果。您所指的语法错误在哪里?很抱歉,我没有权限尝试Postgress。试着像我在示例中那样添加订单。我看到了发生了什么-你得到了一个交叉表,但它看起来不像你期望的那样。它是交叉制表符/旋转pref id和值。尝试插入更多的名称和值组合。它应该开始显示一个轴心。我认为你的标签也让你困惑。。
    row_name |  carrier_1   |   carrier_2
   -----+--------------+----------------
   1 | 2125551234      |
   2 | @att.com        | 2332323232
   3 | @something.com  | @somethingelse.com
CREATE TEMP TABLE prefs (pref_id int, pref_name text, pref_value text);

INSERT INTO prefs VALUES 
 (1, 'PagerNumber' , '2125551234')
,(2, 'PagerCarrier', '@att.com')
,(3, 'PagerCarrier', '@something.com');
SELECT *
FROM   crosstab(
       'SELECT pref_id, pref_name, pref_value
        FROM   prefs
        ORDER  BY 1, 2',

       $$VALUES ('PagerNumber'::text), ('PagerCarrier')$$
       )
AS x (section text, pager_number bigint, pager_carrier text);