如何在 SQL Server 中对表应用累积折扣?

问题描述 投票:0回答:1

对于表格,我需要在公式视图中如下计算

DISCOUNT_AMOUNT
AMOUNT_REST
。对于每个
NAME
,每一行都有一个重复的唯一金额,但是折扣并不是所有行都
AMOUNT*DISCOUNT%
,只有
DATE
升序的第一个折扣订单。相同
NAME
的下一个折扣适用于
AMOUNT_REST
.

用 SQL SERVER 语言解决这个问题的方法?

select [NAME], [AMOUNT], [DISCOUNT%], [DATE]--, DISCOUNT_AMOUNT, AMOUNT_REST
FROM [Table]
order by [NAME], [DATE] asc

这就是我想要的:

[姓名] [金额] [日期] (dd-MM-yyyy) [折扣%] [DISCOUNT_AMOUNT] [AMOUNT_REST]
彼得 100 美元 01-01-2023 4% 4.0 美元 96.0 美元
彼得 100 美元 02-01-2023 20% 19.2 美元 76.8 美元
彼得 100 美元 03-01-2023 5% 3.8 美元 73.0 美元
约翰 500 美元 01-01-2023 40% $200,0 $300,0
约翰 500 美元 02-01-2023 3% 9.0 美元 291.0 美元
萨拉 200 美元 01-01-2023 9% 18.0 美元 182.0 美元
萨拉 200 美元 02-01-2023 10% 18.2 美元 163.8 美元

这是 Excel 手动操作方法

[姓名] [金额] [日期] (dd-MM-yyyy) [折扣%] [DISCOUNT_AMOUNT] [AMOUNT_REST]
彼得 100 44927 0,04 B2*D2 B2*(1-D2)
彼得 100 44928 0,2 F2*D3 F2*(1-D3)
彼得 100 44929 0,05 F3*D4 F3*(1-D4)
约翰 500 44927 0,4 B5*D5 B5*(1-D5)
约翰 500 44928 0,03 F5*D6 F5*(1-D6)
萨拉 200 44927 0,09 B7*D7 B7*(1-D7)
萨拉 200 44928 0,1 F7*D8 F7*(1-D8)
sql sql-server recursive-query
1个回答
0
投票

虽然可能有一种数学方法可以使用窗口函数来计算累积折扣,但这似乎更容易通过递归查询来实现:

with 
    data as (
        select t.*, row_number() over(partition by name order by date) rn
        from mytable t
    ),
    rcte as (
        select name, amount, date, discount_pct, rn,
            amount * discount_pct       as discount_amount,
            amount * (1 - discount_pct) as rest_amount
        from data
        where rn = 1
        union all
        select r.name, r.amount, d.date, d.discount_pct, d.rn
            r.rest_amount * d.discount_pct,
            r.rest_amount * (1 - d.discount_pct)              
        from rcte r
        inner join data d on d.name = r.name and d.rn = r.rn + 1
    )
select * from rcte

第一个 CTE,

data
,枚举每个
name
的行。然后
rcte
从每个分区的第一行开始并迭代,基本上应用与您问题中的Excel公式相同的计算逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.