2016-04-27 5 views
1

У меня есть таблица вроде этого.строка агрегатная группа и подсчет значения

| table      | 
| class_id| name | gender | 
+---------+---------+----------+ 
|  1 | Jane |  F | 
|  1 | John |  M | 
|  1 | Tom  |  M | 
|  1 | Bob  |  M | 
|  2 | Jack |  M | 
|  2 | Kate |  F | 

У меня такой запрос.

select id, array_to_string(array_agg(name), ' - '::text) as name_list from table 
group by class_id 

Мой результат

| 1 | Jane-John-Tom-Bob | 

Но я хотел бы считать мой пол подсчет и я имею в виду в первой группе (Касс 1) я нужен столбец как 1 F + 3 M

Мой запрос - это что-то вроде этого, и я хотел бы использовать его в 1 группе.

| 1 | Jane-John-Tom-Bob |1F + 3M 
+2

'array_to_string (array_agg (имя), '- ':: текст)' может быть упрощено до 'string_agg (имя,' -')' –

ответ

2

Вы можете сделать это с отфильтрованным агрегатом:

select id, 
     string_agg(name), ' - ') as name_list, 
     concat( 
      count(*) filter (where gender = 'F'), 
      'F + ', 
      count(*) filter (where gender = 'M'), 
      'M') as gender_count 
from table 
group by class_id; 

Если вы находитесь на старую версию Postgres, вам нужно заменить

count(*) filter (where gender = 'F') 

с

count(case when gender = 'F' then 1 end) 

(и то же самое для 'M')

+0

Спасибо за помощь. Замечательно. Для дальнейшего использования, если я не знаю значения, но я знаю столбец, который я могу использовать для группы, как я могу использовать его в фильтре? Возможно, я могу использовать более 10 значений фильтра. – lokmancetin

+0

@lokmancetin: извините, я вас не понимаю. Столбец, который вы группируете, не имеет ничего общего с столбцом, в котором применяется отфильтрованный агрегат, на –

+0

В вашем ответе значения фильтра распространены как F и M. Simple. Но что, если значения фильтра больше 50 i.e, и эти 50 значений также находятся в столбце в этой текущей таблице. Я могу получить его значения по группам, и я бы хотел использовать эти групповые значения в агрегате фильтра. – lokmancetin

0

Существует и другое решение без использования агрегата фильтра

select tt.class_id, string_agg (t, ','::text) as gender, string_agg(distinct y,','::text) as name 

from 

(

select class_id, count(gender)::text|| string_agg(distinct gender, ',' ) as t 
     from string_test 
group by class_id , gender 

) tt , 

(
select class_id, string_agg(distinct name::text, ','::text) as y 
    from string_test 
group by class_id 
) yy 
where tt.class_id=yy.class_id 

group by tt.class_id 

Результат;

+==========+========+===================+ 
| class_id | gender | name    | 
+==========+========+===================+ 
| 1  | 1F,3M | Bob,Jane,John,Tom | 
+----------+--------+-------------------+ 
| 2  | 1F,1M | Jack,Kate   | 
+==========+========+===================+ 
Смежные вопросы