对于表格,我需要在公式视图中如下计算
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) |
虽然可能有一种数学方法可以使用窗口函数来计算累积折扣,但这似乎更容易通过递归查询来实现:
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公式相同的计算逻辑。