2013-03-12 6 views
1

Я хотел бы результат этого запроса в кросс-таблице:Перекрестный запрос в PostgreSQL

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

ответ

2

Вы можете использовать функцию агрегата с выражением 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 
+0

спасибо, вот он! –

3

Эта функция перекрестной производит именно то, что вы просили (для упрощенных типов данных, за исключением):

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

Смежные вопросы