如何查询有很多联系电话的客户?的SQL

问题描述

我有2张桌子,客户和联系电话。每个客户都有一个或多个联系电话,其一对多关系。我需要制作一个excel文档,每一行都有一个客户及其联系电话。例如:

客户名称| contact_number_1 | contact_number_2 | ...

我想在POSTGREsql中做到快速。我制作Excel文件的方式都没关系。我只需要查询就可以了。

谢谢!

解决方法

如果您可以解析结果并从那里创建Excel文件,最灵活的解决方案是将数字聚合到一个数组中:

select c.client_id,c.client_name,array_agg(cn.number) as contact_numbers
from client c
  join concat_number cn on cn.client_id = c.client_id
group by c.client_id,c.client_name;

另一种替代方法是使用string_agg(cn.number,',')获取以逗号分隔的列表(但该数组对于名称中的嵌入式逗号更健壮)。

如果确实需要在单独的列中获取数字,则需要确定合理的列上限,然后可以使用第一个查询并将数组元素提取为列:

select client_id,client_name,contact_numbers[1] as contact_number_1,contact_numbers[2] as contact_number_2,contact_numbers[3] as contact_number_3,... 
from (      
  select c.client_id,array_agg(cn.number) as contact_numbers
  from client c
    join concat_number cn on cn.client_id = c.client_id
  group by c.client_id,c.client_name
) t
,

如果您实际上想要返回动态的列数,则会变得有些复杂,因为您必须知道返回结果的最大列数,或者对您认为将存在的最大数硬编码一个设置的数

如果您可以只用一栏代表所有可能的联系人,那么可以将它们汇总到一个栏中:

select c.clientName,STRING_AGG(COALESCE(con.contact_number,''),'|') as contact_numbers
from clients c
left join contacts con on c.clientId = con.clientId
group by c.clientName
order by c.clientName