基于多列需要窗函数的条件计算

Posted

技术标签:

【中文标题】基于多列需要窗函数的条件计算【英文标题】:Conditional calculation based on multiple columns requiring a window function 【发布时间】:2021-07-12 13:32:43 【问题描述】:

这是我正在使用的表:

CUST_REF ACCOUNT_NUMBER VALUATION RATE
10001 ABC123 2000 0.0025
10001 XYZ456 3000 45
10001 DEF334 2000 45

我正在尝试在 SQL Server 中构建一个费用计算器,该计算器将费率应用于帐户估值,并加入了一些特殊条件。我设法掩盖了所有排列,但被一个边缘情况抛出在某些情况下,我需要采用每月 3.75 英镑的固定费率。

对于上面的示例,我要生成的表以及预期的输出如下:

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

...但是上面的代码没有产生预期的输出,因为计算的比例不准确。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为您只是错过了 sum 函数中的按比率分区。

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

返回:

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(如此处所示)使人们更容易为您提供帮助。

【讨论】:

以上是关于基于多列需要窗函数的条件计算的主要内容,如果未能解决你的问题,请参考以下文章

根据多列聚合函数的条件结果计算唯一记录

pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据其中多列索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引

excel多列文字合并成一列的方法都有哪些步骤

如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数

pandas有没有计算低于某个值的函数

python中怎么生成基于窗函数的fir滤波器