web-dev-qa-db-ja.com

PostgreSQL 9.0でcrosstab()ピボットテーブルを作成する

自分にはかなり複雑な問題があり、誰かが助けてくれるといいのですが。

PostgreSQLを使用して、ジオメトリのないテーブルからピボットテーブルを作成できるようにしたいと考えています。

シンプルに保つために、ピボットに使用するテーブル構造を表示し、次に、指定されたメソッドを使用して他のものを作成します:)

使用したいフィールドはpostcode_nospace_ageband

agebandpostcode_nospace_は、各郵便番号のカウントがデータである行です。

2132のレコードがあり、そのうちのいくつかは複数の郵便番号を持っているため、カウントされます。

CREATE TABLE adult_social_care.activities_in_localities_asc
(
  ogc_fid integer NOT NULL,
  sort numeric(5,0),
  ageband character(12),
  postcode_nospace_ character(8),
  wkb_geometry geometry,
  CONSTRAINT activities_in_localities_asc_pkey PRIMARY KEY (ogc_fid)
);

更新:

これは、同じデータを持つExcelピボットテーブルに示されているように、達成したい結果です。

postcode 18_24  25_34   35_44   45_54   55_64   65_74   Total Count
----------------------------------------------------------------------------
BB115DE     1           2                   2      3       8
FY38LZ                              1       1              2

周りを見回して、次のSQLクエリをコンパイルしました。郵便番号でグループ化し、必要なフィールド名を作成します。ただし、フィールドは空白です。理想的にはtotal_count列はテーブルの最後にあります。

SELECT * FROM crosstab(
    'SELECT postcode_nospace_, ageband, count(ageband) as total_count
     FROM adult_social_care.activities_in_localities_asc
     GROUP BY postcode_nospace_, ageband
     ORDER BY postcode_nospace_'

     ,$$VALUES ('18-24'::text), ('25-34'), ('35-44'), ('45-54'), ('55-64'), ('65-74'), ('75-84'), ('85-94'), ('95 AND OVER')$$)
AS ct("postcode" text, "18-24" numeric, "25-34" numeric,"35-44" numeric, "45-54" numeric, "55-64" numeric, "65-74" numeric, "75-84" numeric, "85-94" numeric, "95 AND OVER" numeric);
4
daniel franklin

あなたのテーブル定義は言う

...
ageband character(12),
...

つまり、そこの値は'18-24 ' の代わりに '18-24'。このように、VALUESリストの項目はテーブルの値と一致しないため、結果として空のテーブルが作成されます。

列の型をもう少しわかりやすいtextに変更すると(Erwinが指摘するように、値もトリミングされます):

ALTER TABLE activities_in_localities_asc ALTER COLUMN ageband TYPE text;

希望する結果が得られます。

4
dezso