我有一个佣金条带表,其中包含以下内容:
Lower Upper Percentage
0 300 45
300.01 800 50
800.01 1500 55
下限和上限金额是货币值,我需要使用与总销售额相关的百分比金额,根据总销售额计算累计支付金额。
如果我的总销售额为350,我的佣金应计算如下:
总数中的前300个将使用45%
剩下的50人将使用50%
所以我的总数将是
300*45% = 135
50*50% = 25
Total = 160
我正在通过sproc更新一个包含金额的表,所以需要在那里容纳这个。
最好的解决方法是什么?
注意:下面的sproc具有正确的列名称,如上例所示,为了简单起见,我更改了列的名称。 SPROC还加入了存储频段的表,更新表是一种工作/报告表
编辑:sproc更新部分:
UPDATE CommissionCalculationDetails
SET TotalCommissionAmount =
case
when TotalSales > Upper then Upper
when TotalSale > Lower then @sales - Lower
else 0
end
* Percentage / 100
FROM CommissionCalculationDetails
LEFT JOIN CommissionBand
ON TotalSales > CommissionBand.Lower
AND TotalSales < CommisionBand.Upper
答案 0 :(得分:5)
我建议您存储非包含性下限(例如:300
而不是300.01
)并严格使用,而不是比较时。就目前而言,价值300.005
将无法正确分类。
如果是这种情况,您可以使用以下查询计算总佣金:
select
sum (
case
when @sales > Upper then Upper
when @sales > Lower then @sales - Lower
else 0
end
* Percentage / 100
) as TotalCommission
from CommissionTable
以下是此版本的在线测试版:http://www.sqlfiddle.com/#!3/87f12/8
稍微偏离主题:您的表目前包含冗余信息;每个下限(或多或少)等于前一个上限。虽然这不是必需的,但您可以考虑一种方法来存储,例如,仅存储上限(并且null
表示无界)。
对于更新,一种可能的解决方案是在function中提取佣金计算,如下所示:
create function ufn_CalculateCommission(@Sales money)
returns money
as
begin
declare @result money
select
@result =
sum (
case
when @sales > Upper then Upper
when @sales > Lower then @sales - Lower
else 0
end
* Percentage / 100
)
from CommissionBand
return @result
end
声明该功能后,更新可以简化为:
update CommissionCalculationDetails
set TotalCommissionAmount = dbo.ufn_CalculateCommission(TotalSales);
以下是它的工作原理:http://www.sqlfiddle.com/#!3/f4405/4