You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:SQL Server中保留同列组正金额行的查询方法

解决SQL Server中保留正负抵消组的正金额行问题

示例数据

假设原查询返回的结果(或对应表)如下:

DatesettleacctNumnameTCodeAmount
2024-01-01S001A1001张三T001100.00
2024-01-01S001A1001张三T001-100.00
2024-01-02S002A1002李四T00250.00
2024-01-02S002A1002李四T002-50.00
2024-01-03S003A1003王五T003-30.00
2024-01-04S004A1004赵六T00480.00

预期结果

仅移除存在对应正金额抵消的负金额行,其余记录保留:

DatesettleacctNumnameTCodeAmount
2024-01-01S001A1001张三T001100.00
2024-01-02S002A1002李四T00250.00
2024-01-03S003A1003王五T003-30.00
2024-01-04S004A1004赵六T00480.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:03:09