微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何查询有很多联系电话的客户?的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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。