如何在postgresql中使用与聚合函数的连接?

时间:2017-08-01 05:50:35

标签: postgresql postgresql-9.1 postgresql-9.3 postgresql-9.2 postgresql-9.4

我有4张桌子

表1

id    | name    
1     | A
2     | B

表2

id    | name1    
1     | C
2     | D

表3

id    | name2    
1     | E
2     | F

表4

id    | name1_id    | name2_id    | name3_id        
1     | 1           | 2           | 1
2     | 2           | 2           | 2
3     | 1           | 2           | 1
4     | 2           | 1           | 1
5     | 1           | 1           | 2
6     | 2           | 2           | 1
7     | 1           | 1           | 2
8     | 2           | 1           | 1
9     | 1           | 2           | 1
10    | 2           | 2           | 1

现在我想用4加入所有表并获得这种类型的输出

name    | count
{A,B}   | {5, 5}
{C,D}   | {5, 6}
{E,F}   | {7, 3}

我试过这个

select array_agg(distinct(t1.name)), array_agg(distinct(temp.test))
from  
 (select t4.name1_id, (count(t4.name1_id)) "test" 
    from table4 t4 group by t4.name1_id
) temp
join table1 t1
on temp.name1_id = t1.id

我正在努力实现这一目标。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:2)

分别计算每个表的计数并合并结果:

select 
    array_agg(name order by name) as name, 
    array_agg(count order by name) as count
from (
    select 1 as t, name, count(*)
    from table4
    join table1 t1 on t1.id = name1_id
    group by name
    union all
    select 2 as t, name, count(*)
    from table4
    join table2 t2 on t2.id = name2_id
    group by name
    union all
    select 3 as t, name, count(*)
    from table4
    join table3 t3 on t3.id = name3_id
    group by name
    ) s
group by t;

 name  | count 
-------+-------
 {A,B} | {5,5}
 {C,D} | {4,6}
 {E,F} | {7,3}
(3 rows)