如何解决如何查询有很多联系电话的客户?的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 举报,一经查实,本站将立刻删除。