我有两个表、客户和联系电话。每个客户都有一个或多个联系电话,这是一对多的关系。我需要制作一个excel文档,每行都有一个客户及其联系电话。例如:
客户端名称|contact_number_1|contact_nnumber_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,
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
) 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