SQL如何筛选符合条件客户并将账户行聚合为指定格式字符串
正确实现SQL(PostgreSQL环境)
SELECT c.client_id, c.surname, string_agg( CONCAT(a.acc_id, ' (', a.currency_type, '): ', a.available_amount), '; ' ORDER BY a.acc_id ) AS accounts FROM clients c INNER JOIN accounts a ON c.client_id = a.client_id WHERE c.client_id IN ( SELECT client_id FROM accounts GROUP BY client_id HAVING COUNT(acc_id) > 1 AND BOOL_OR(available_amount < 0) ) GROUP BY c.client_id, c.surname ORDER BY c.client_id;
实现说明
- 子查询部分完成合格客户筛选:按
client_id分组后,COUNT(acc_id) > 1保证客户名下账户数大于1,BOOL_OR(available_amount < 0)保证至少有一个账户余额为负,两个条件同时满足的客户ID会被筛选出来。 - 外层查询关联
clients和accounts表,使用CONCAT函数按要求格式拼接单个账户的信息,再通过string_agg函数将同一客户的所有账户拼接结果用;连接,ORDER BY a.acc_id保证账户展示顺序和示例一致。 - 最终按
client_id和surname分组,输出要求的三列结果,和给出的示例输出完全匹配。
如果是MySQL环境,只需要将string_agg替换为GROUP_CONCAT即可,对应聚合部分写法为:
GROUP_CONCAT( CONCAT(a.acc_id, ' (', a.currency_type, '): ', a.available_amount) ORDER BY a.acc_id SEPARATOR '; ' ) AS accounts
内容的提问来源于stack exchange,提问作者taciturno
相关产品推荐
相关产品推荐

