2

以下を含むコミッション バンディング テーブルがあります。

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
4

1 に答える 1

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


少しオフトピック: テーブルには現在冗長な情報が含まれています。各下限は、前の上限と (多かれ少なかれ) 等しくなります。これは必須ではありませんが、たとえば、上限のみを格納する方法を考えることができます (そしてunboundednullを意味します)。


更新の場合、考えられる解決策の 1 つは、次のように関数で手数料計算を抽出することです。

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

于 2013-08-02T09:36:07.587 に答える