编写SQL查询完成托管对账:对比两来源证券持仓量
托管对账SQL查询实现
需求说明
对比来源1的Table1与来源2的Table2中的证券持仓量,输出所有唯一ISIN对应的两边持仓数量(无对应数据则显示NULL),其中Table1的持仓量别名为AmountA,Table2的别名为AmountB。
示例数据
Table1(来源1持仓)
| ISIN | Amount |
|---|---|
| US-000402625-0 | 1,000 |
| US-000341234-0 | 2,000 |
Table2(来源2持仓)
| ISIN | Amount |
|---|---|
| US-000402625-0 | 1,000 |
| US-000341234-0 | 500 |
| US-000433045-0 | 200 |
解决方案
标准SQL实现(支持FULL OUTER JOIN的数据库:PostgreSQL、SQL Server等)
使用FULL OUTER JOIN关联两表的ISIN字段,确保所有ISIN都被包含:
SELECT COALESCE(t1.ISIN, t2.ISIN) AS ISIN, t1.Amount AS AmountA, t2.Amount AS AmountB FROM Table1 t1 FULL OUTER JOIN Table2 t2 ON t1.ISIN = t2.ISIN ORDER BY ISIN;
MySQL兼容方案(MySQL不支持FULL OUTER JOIN)
通过LEFT JOIN和RIGHT JOIN结合UNION实现全量关联:
-- 包含Table1所有ISIN及Table2中匹配的数据 SELECT t1.ISIN, t1.Amount AS AmountA, t2.Amount AS AmountB FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.ISIN = t2.ISIN UNION -- 补充Table2中不在Table1的ISIN数据 SELECT t2.ISIN, t1.Amount AS AmountA, t2.Amount AS AmountB FROM Table1 t1 RIGHT JOIN Table2 t2 ON t1.ISIN = t2.ISIN WHERE t1.ISIN IS NULL ORDER BY ISIN;
查询结果
| ISIN | AmountA | AmountB |
|---|---|---|
| US-000402625-0 | 1,000 | 1,000 |
| US-000341234-0 | 2,000 | 500 |
| US-000433045-0 | NULL | 200 |
内容的提问来源于stack exchange,提问作者UncleLeo
相关产品推荐
相关产品推荐

