0

我有4个表如何在postgresql中使用join和聚合函数?

表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 

我试图做到这一点。任何人都可以帮助我。

+0

请标记相应的数据库系统。你不能同时使用所有不同的数据库系统 – Squirrel

+0

好吧我编辑我的问题 –

+0

我试过这个... select array_agg(distinct(rt.name)),array_agg(distinct(temp.test)) from (select f.resource_type_id,(count(f.resource_type_id))“test”from planner.resource_entity f join planner.resource_type ft on f.resource_type_id = ft.id group by f.resource_type_id)temp join planner.resource_type rt 在temp.resource_type_id = rt.id –

回答

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)  
+0

如果我使用列数据类型是表4中的数组然后。 –