计算累计佣金金额

Stu*_*044 2 t-sql sql-server-2008

我有一个佣金条带表,其中包含以下内容:

Lower    Upper     Percentage
0        300       45
300.01   800       50
800.01   1500      55
Run Code Online (Sandbox Code Playgroud)

下限和上限金额是货币值,我需要使用与总销售额相关的百分比金额,根据总销售额计算累计支付金额.

如果我的总销售额为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
Run Code Online (Sandbox Code Playgroud)

Cri*_*scu 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
Run Code Online (Sandbox Code Playgroud)

这是一个在线测试版本:http://www.sqlfiddle.com/#!3/87f12/8


略有偏离:您的表目前包含冗余信息; 每个下限(或多或少)等于前一个上限.虽然这不是必需的,但你可以想出一种方法来存储,例如,只存储上限(并且null表示界限).


对于更新,一种可能的解决方案是在函数中提取佣金计算,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

声明该功能后,更新可简化为:

update CommissionCalculationDetails
set TotalCommissionAmount = dbo.ufn_CalculateCommission(TotalSales);
Run Code Online (Sandbox Code Playgroud)

以下是它的工作原理:http://www.sqlfiddle.com/#!3/f4405/4