2013-08-02 257 views
2

我有一个包含以下内容的佣金绑扎表:计算累计佣金额

Lower Upper  Percentage 
0  300  45 
300.01 800  50 
800.01 1500  55 

的下限和上限金额是货币价值,我需要计算累积量基于总销量的付出,用与总销售额相关的百分比数额。

第一总数的300将采用45% 剩余50将使用50% :

如果我再有350总销售量,我的佣金应为以下计算所以我总将
300*45% = 135
50*50% = 25
Total = 160

我更新表通过一个存储过程数额,使需要适应这一点在那里。

这是怎么回事?

注意:下面的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 

回答

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


稍微offtopic:你的表目前

如果是这样的话,你可以使用下面的查询计算的佣金总额包含冗余信息;每个下限(或多或少)等于先前的上限。虽然这不是必需的,但您可以考虑一种方法来存储例如上限(并且具有无限的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

+0

谢谢!我可以改变界限,所以这应该工作....只有其他的事情是SPROC正在使用将需要有TotalCommission(在你的例子中)作为更新,所以在这种情况下聚合失败? – Stuart1044

+0

@ Stuart1044你能否用相关的存储过程代码更新你的问题? – GolfWolf

+0

我现在已经加入....非常感谢您的帮助/建议 – Stuart1044