求助:SQL Server中保留同列组正金额行的查询方法
解决SQL Server中保留正负抵消组的正金额行问题
示例数据
假设原查询返回的结果(或对应表)如下:
| Date | settle | acctNum | name | TCode | Amount |
|---|---|---|---|---|---|
| 2024-01-01 | S001 | A1001 | 张三 | T001 | 100.00 |
| 2024-01-01 | S001 | A1001 | 张三 | T001 | -100.00 |
| 2024-01-02 | S002 | A1002 | 李四 | T002 | 50.00 |
| 2024-01-02 | S002 | A1002 | 李四 | T002 | -50.00 |
| 2024-01-03 | S003 | A1003 | 王五 | T003 | -30.00 |
| 2024-01-04 | S004 | A1004 | 赵六 | T004 | 80.00 |
预期结果
仅移除存在对应正金额抵消的负金额行,其余记录保留:
| Date | settle | acctNum | name | TCode | Amount |
|---|---|---|---|---|---|
| 2024-01-01 | S001 | A1001 | 张三 | T001 | 100.00 |
| 2024-01-02 | S002 | A1002 | 李四 | T002 | 50.00 |
| 2024-01-03 | S003 | A1003 | 王五 | T003 | -30.00 |
| 2024-01-04 | S004 | A1004 | 赵六 | T004 | 80.00 |
SQL解决方案(适用于SQL Server 15.0.41)
方法1:使用EXISTS子查询(逻辑直观)
SELECT t1.* FROM your_query_result t1 WHERE -- 直接保留所有正金额行 t1.Amount > 0 -- 仅保留无对应正金额抵消的负金额行 OR NOT EXISTS ( SELECT 1 FROM your_query_result t2 WHERE t2.Date = t1.Date AND t2.settle = t1.settle AND t2.acctNum = t1.acctNum AND t2.name = t1.name AND t2.TCode = t1.TCode AND t2.Amount = -t1.Amount );
将上述代码中的your_query_result替换为你的实际查询语句(比如用(SELECT Date, settle, acctNum, name, TCode, Amount FROM your_table WHERE ...))。
方法2:使用窗口函数(适合大数据量场景)
WITH grouped_records AS ( SELECT Date, settle, acctNum, name, TCode, Amount, -- 标记同组内是否存在对应相反数的金额 MAX(CASE WHEN Amount > 0 THEN Amount END) OVER (PARTITION BY Date, settle, acctNum, name, TCode) AS matched_pos_amount FROM your_query_result ) SELECT Date, settle, acctNum, name, TCode, Amount FROM grouped_records WHERE Amount > 0 OR (Amount < 0 AND (matched_pos_amount IS NULL OR ABS(Amount) <> matched_pos_amount));
逻辑说明
- 两种方法核心逻辑一致:保留所有正金额行;仅当负金额行不存在同组(除Amount外其余列完全匹配)且金额为其相反数的记录时,才保留该负金额行。
- 若同组内存在多组正负抵消记录(如同一组有
100、-100、200、-200),两种方法都能正确保留所有正金额行,移除对应的负金额行。
内容的提问来源于stack exchange,提问作者BigPicture
相关产品推荐
相关产品推荐

