2016-04-27 171 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 | 

,但我想算我的性別也算我的意思是在第一組(CASS 1)我需要像1 F + 3M的

我的要求是這樣的,我想在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,那麼該值如何也在本表中的列中。我可以通過組獲得他的值,我想在過濾器聚合中使用這些組合值。 – 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   | 
+==========+========+===================+