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

SQL Server中如何筛选扣除退款后的有效交易行?

在SQL Server中获取扣除退款后的有效交易记录

要实现同一ApplicationID下抵消金额总和为0的交易、保留剩余有效行的需求,可以通过窗口函数计算累计收入和总退款金额,筛选出未被抵消的收入行。以下是具体实现:

WITH transaction_cte AS (
    SELECT
        CustomerCode,
        ApplicationID,
        InvoiceNumber,
        Date,
        Revenue,
        -- 计算当前订单的总剩余金额(收入减退款)
        SUM(Revenue) OVER (PARTITION BY ApplicationID) AS total_remaining,
        -- 按日期排序,累计计算当前及之前的收入总和
        SUM(CASE WHEN Revenue > 0 THEN Revenue ELSE 0 END) OVER (
            PARTITION BY ApplicationID 
            ORDER BY Date, InvoiceNumber 
            ROWS UNBOUNDED PRECEDING
        ) AS running_positive_sum,
        -- 计算当前订单的总退款绝对值
        SUM(CASE WHEN Revenue < 0 THEN ABS(Revenue) ELSE 0 END) OVER (PARTITION BY ApplicationID) AS total_refund_amount
    FROM [Table] -- 替换为你的实际表名
)
SELECT
    CustomerCode,
    ApplicationID,
    InvoiceNumber,
    Date,
    Revenue
FROM transaction_cte
WHERE
    -- 仅保留总剩余金额为正的订单行
    total_remaining > 0
    -- 筛选未被退款抵消的收入行:累计收入超过总退款金额的部分
    AND Revenue > 0
    AND running_positive_sum > total_refund_amount
ORDER BY ApplicationID, Date;

逻辑说明:

  • CTE部分:
    • total_remaining:计算每个ApplicationID的最终剩余金额,若该值≤0则整单无有效交易,直接排除。
    • running_positive_sum:对每个订单下的收入交易(Revenue>0)按日期排序,逐行累计求和,用于判断哪部分收入未被退款抵消。
    • total_refund_amount:统计每个订单的总退款金额(取绝对值),作为抵消阈值。
  • 筛选条件:
    • 只保留总剩余为正的订单行。
    • 仅保留收入行中累计收入超过总退款的部分——这部分就是未被退款抵消的有效交易。
    • 无退款的订单(total_refund_amount=0)会自动保留所有收入行,因为running_positive_sum必然大于0。

内容的提问来源于stack exchange,提问作者Bugra Varol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:05:15