基于需要 window 函数的多列条件计算
Conditional calculation based on multiple columns requiring a window function
这是我正在使用的table:
CUST_REF
ACCOUNT_NUMBER
VALUATION
RATE
10001
ABC123
2000
0.0025
10001
XYZ456
3000
45
10001
DEF334
2000
45
我正在尝试在 SQL 服务器中构建一个费用计算器,该计算器将费率应用于帐户估值,并加入了一些特殊条件。我已经设法涵盖所有排列但被抛出在少数情况下,我需要采用每月 3.75 英镑的固定费率。
对于上面的示例,我希望生成的 table 具有预期的输出,如下所示:
CUST_REF
ACCOUNT_NUMBER
VALUATION
RATE
FEE
10001
ABC123
2000
0.0025
0.42
10001
XYZ456
3000
45
2.25
10001
DEF334
2000
45
1.50
本质上:
- 如果费率不是“45”,则通过将估价数字乘以费率 / 12 来计算费用。
- 当任何账户出现 45 时,将 3.75 英镑的固定数字分配给任何利率为 45 的账户,按照估值的比例 - 在这种情况下,3000 / 5000 = 60% 或 2.25 至第一个帐户和下一个帐户 1.50。
我试过了...
SELECT
A.CUST_REF,
A.ACCOUNT_NUMBER,
A.VALUATION,
A.RATE,
CASE
WHEN A.RATE= 45 THEN 3.75 * (A.VALUATION) / SUM(A.VALUATION) OVER (PARTITION BY A.CUST_REF)
WHEN A.RATE != 45 THEN (A.VALUATION) * (A.RATE/12)
FROM FEES_TABLE A
...但是上面的代码没有产生预期的输出,因为计算的比例不准确。
有什么想法吗?
我认为您只是错过了在求和函数中按比率进行分区。
declare @FEES_TABLE table (CUST_REF int, ACCOUNT_NUMBER varchar(6), VALUATION money, RATE money);
insert into @FEES_TABLE (CUST_REF, ACCOUNT_NUMBER, VALUATION, RATE)
values
(10001, 'ABC123', 2000, 0.0025),
(10001, 'XYZ456', 3000, 45),
(10001, 'DEF334', 2000, 45);
select A.CUST_REF, A.ACCOUNT_NUMBER, A.VALUATION, A.RATE
, convert(decimal(9,2),
case when RATE != 45 then A.VALUATION * A.RATE / 12
else VALUATION / sum(A.VALUATION) over (partition by A.CUST_REF, A.RATE/*<-- this fixes it*/) * 3.75 end
) FEE
from @FEES_TABLE A
Returns:
CUST_REF
ACCOUNT_NUMBER
VALUATION
RATE
FEE
10001
ABC123
2000
0.0025
0.42
10001
XYZ456
3000
45
2.25
10001
DEF334
2000
45
1.50
注意:将示例数据添加为 DDL+DML(如此处所示)可以让人们更轻松地为您提供帮助。
这是我正在使用的table:
CUST_REF | ACCOUNT_NUMBER | VALUATION | RATE |
---|---|---|---|
10001 | ABC123 | 2000 | 0.0025 |
10001 | XYZ456 | 3000 | 45 |
10001 | DEF334 | 2000 | 45 |
我正在尝试在 SQL 服务器中构建一个费用计算器,该计算器将费率应用于帐户估值,并加入了一些特殊条件。我已经设法涵盖所有排列但被抛出在少数情况下,我需要采用每月 3.75 英镑的固定费率。
对于上面的示例,我希望生成的 table 具有预期的输出,如下所示:
CUST_REF | ACCOUNT_NUMBER | VALUATION | RATE | FEE |
---|---|---|---|---|
10001 | ABC123 | 2000 | 0.0025 | 0.42 |
10001 | XYZ456 | 3000 | 45 | 2.25 |
10001 | DEF334 | 2000 | 45 | 1.50 |
本质上:
- 如果费率不是“45”,则通过将估价数字乘以费率 / 12 来计算费用。
- 当任何账户出现 45 时,将 3.75 英镑的固定数字分配给任何利率为 45 的账户,按照估值的比例 - 在这种情况下,3000 / 5000 = 60% 或 2.25 至第一个帐户和下一个帐户 1.50。
我试过了...
SELECT
A.CUST_REF,
A.ACCOUNT_NUMBER,
A.VALUATION,
A.RATE,
CASE
WHEN A.RATE= 45 THEN 3.75 * (A.VALUATION) / SUM(A.VALUATION) OVER (PARTITION BY A.CUST_REF)
WHEN A.RATE != 45 THEN (A.VALUATION) * (A.RATE/12)
FROM FEES_TABLE A
...但是上面的代码没有产生预期的输出,因为计算的比例不准确。
有什么想法吗?
我认为您只是错过了在求和函数中按比率进行分区。
declare @FEES_TABLE table (CUST_REF int, ACCOUNT_NUMBER varchar(6), VALUATION money, RATE money);
insert into @FEES_TABLE (CUST_REF, ACCOUNT_NUMBER, VALUATION, RATE)
values
(10001, 'ABC123', 2000, 0.0025),
(10001, 'XYZ456', 3000, 45),
(10001, 'DEF334', 2000, 45);
select A.CUST_REF, A.ACCOUNT_NUMBER, A.VALUATION, A.RATE
, convert(decimal(9,2),
case when RATE != 45 then A.VALUATION * A.RATE / 12
else VALUATION / sum(A.VALUATION) over (partition by A.CUST_REF, A.RATE/*<-- this fixes it*/) * 3.75 end
) FEE
from @FEES_TABLE A
Returns:
CUST_REF | ACCOUNT_NUMBER | VALUATION | RATE | FEE |
---|---|---|---|---|
10001 | ABC123 | 2000 | 0.0025 | 0.42 |
10001 | XYZ456 | 3000 | 45 | 2.25 |
10001 | DEF334 | 2000 | 45 | 1.50 |
注意:将示例数据添加为 DDL+DML(如此处所示)可以让人们更轻松地为您提供帮助。