计算累计佣金金额

时间:2013-08-02 09:25:06

标签: sql-server-2008 tsql

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

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

1 个答案:

答案 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