如何修改SQL查询移除应收款已结清的客户参考行
客户采购记录查询优化方案
原始客户采购活动表格
| DateOfActivity | CustomerReference | Reference Line | Description | Receivable Amount |
|---|---|---|---|---|
| 24/10/2022 | CUST567 | 1 | Credit Purchase | 20,000 |
| 24/10/2022 | CUST567 | 4 | Credit Purchase | 10,000 |
| 24/10/2022 | CUST555 | 2 | Credit Purchase | 50,000 |
| 27/10/2022 | CUST555 | 2 | Contract Sign | 0 |
| 27/10/2022 | CUST567 | 4 | Contract Sign | 0 |
| 27/10/2022 | CUST567 | 1 | Contract Sign | 0 |
| 27/10/2022 | CUST567 | 4 | Repayment | -3,500 |
| 27/10/2022 | CUST567 | 4 | Repayment | -6,500 |
| 13/11/2022 | CUST567 | 1 | Repayment | -10,000 |
| 13/11/2022 | CUST567 | 1 | Repayment | -2,000 |
| 18/11/2022 | CUST567 | 1 | Contract Sign | 0 |
| 18/11/2022 | CUST567 | 1 | Repayment | -3,000 |
原始查询语句
Select DateOfActivity, CustomerReferencce, ReferenceLine, Description, ReceivableAmount From 'Table A' Where DateOfActivity >= '2022-09-01' Group by DateOfActivity
预期查询结果
| DateOfActivity | CustomerReference | Reference Line | Description | Receivable Amount |
|---|---|---|---|---|
| 24/10/2022 | CUST567 | 1 | Credit Purchase | 20,000 |
| 24/10/2022 | CUST555 | 2 | Credit Purchase | 50,000 |
| 27/10/2022 | CUST555 | 2 | Contract Sign | 0 |
| 27/10/2022 | CUST567 | 1 | Contract Sign | 0 |
| 13/11/2022 | CUST567 | 1 | Repayment | -10,000 |
| 13/11/2022 | CUST567 | 1 | Repayment | -2,000 |
| 18/11/2022 | CUST567 | 1 | Contract Sign | 0 |
| 18/11/2022 | CUST567 | 1 | Repayment | -3,000 |
说明:CUST567 Reference Line 4的所有记录已被移除,因为该组合下应收款总和为0,其他客户记录均保留。
修改后的查询语句(适配大数据场景)
WITH CustomerBalances AS ( SELECT CustomerReference, ReferenceLine, SUM(CAST(REPLACE(ReceivableAmount, ',', '') AS DECIMAL(18,2))) AS TotalReceivable FROM 'Table A' WHERE DateOfActivity >= '2022-09-01' GROUP BY CustomerReference, ReferenceLine ) SELECT t.DateOfActivity, t.CustomerReference, t.ReferenceLine, t.Description, t.ReceivableAmount FROM 'Table A' t JOIN CustomerBalances cb ON t.CustomerReference = cb.CustomerReference AND t.ReferenceLine = cb.ReferenceLine WHERE t.DateOfActivity >= '2022-09-01' AND cb.TotalReceivable != 0 ORDER BY t.DateOfActivity, t.CustomerReference, t.ReferenceLine;
核心逻辑说明
- 预计算余额:通过CTE
CustomerBalances一次性计算每个CustomerReference+ReferenceLine组合的应收款总和,处理金额字段中的逗号并转换为数值类型,确保求和准确。 - 过滤结清记录:将原始表与预计算的余额表关联,直接过滤掉总和为0的客户+行号组合,避免重复计算。
- 大数据适配:分组计算仅执行一次,联合索引(建议在
CustomerReference和ReferenceLine上创建)可大幅提升JOIN操作效率,适配数据持续增长的场景。
内容的提问来源于stack exchange,提问作者saashe
相关产品推荐
相关产品推荐

