1

このクエリの結果をクロス集計で表示したい:

SELECT district, sex ,count(sex)
FROM table1
GROUP BY sex, district
ORDER BY district;

district | sex | count
---------+-----+-----
dis_1    | M   | 2
dis_1    | F   | 4
dis_1    | NI  | 1
dis_2    | M   | 5
dis_2    | F   | 2

このような:

district | M | F | NI
---------+---+---+---
dis_1    | 2 | 4 | 1
dis_2    | 5 | 2 | 0

以下のクエリのように、成功せずにいくつかのテストを行いました。

SELECT  row_name AS district,
        category_1::varchar(10) AS m,
        category_2::varchar(10) AS f,
        category_3::varchar(10) AS ni,
        category_4::int AS count

FROM crosstab('select district, sex, count(*)
               from table1 group by district, sex')
     AS ct  (row_name varchar(27), 
             category_1 varchar(10), 
             category_2 varchar(10), 
             category_3 varchar(10),
             category_4 int);
4

2 に答える 2

4

このクロス集計関数は、(単純化されたデータ型を除いて) まさにあなたが求めたものを生成します:

SELECT *
FROM   crosstab('
         SELECT district, sex, count(*)::int
         FROM   table1
         GROUP  BY 1,2
         ORDER  BY 1,2'
        ,$$VALUES ('M'), ('F'), ('NI')$$)
AS ct (district text
      ,"M"      int
      ,"F"      int
      ,"NI"     int);

試行中にいくつかのエラーが発生しました。
この密接に関連する回答で詳細と説明を見つけてください:
PostgreSQL Crosstab Query

于 2013-03-14T23:37:17.547 に答える
3

式で集計関数を使用してCASE、結果を列で取得できます。

select district,
  sum(case when sex ='M' then 1 else 0 end) M,
  sum(case when sex ='F' then 1 else 0 end) F,
  sum(case when sex ='NI' then 1 else 0 end) NI
from table1
group by district
order by district
于 2013-03-12T01:48:38.893 に答える