2

テーブルが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 の次の例に従って、クロス集計を使用しました: PostgreSQL Crosstab Query

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);

すべての値が に入りpager_numberpager_carrier空のままになります。

 section |  pager_number  | pager_carrier
---------+----------------+---------------
       1 | 2125551234     |
       2 | @att.com       |
       3 | @something.com |

誰が何が起こっているかを見ることができますか?

4

2 に答える 2

3

テスト ケース (サンプル データを提供するための推奨される方法):

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);

質問に示されている結果を正確に返します。aが有効な数値PagerNumber以外になる可能性がある場合は、代わりに使用します。biginttext

あなたの質問で言及している答えは時代遅れであり、そもそも正しいものではありませんでした。そこに説明とリンクを含む適切な回答を追加しました。

于 2012-08-01T03:30:16.943 に答える
0

それ以外の:

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);

試す:

SELECT *
FROM crosstab('select pref_id::bigint, pref_name::text, pref_value::text
FROM prefs ORDER BY 1,2')
AS prefs (row_name bigint, carrier_1 text, carrier_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

Postgress クロス集計リファレンス

于 2012-08-01T00:12:49.897 に答える