3

以下のシナリオの計算をストアド プロシージャに記述しなければなりません。以下のコードを書きました。正しいか、または他に良い書き方があれば教えてください。

「x」値の純資産額があり、次の条件でこの「x」値のコミッションを計算する必要があります

  1. 総純資産は最大 £5,000 - 30%
  2. 合計純資産は最大 £5,000.01 から £20,000 - 35%
  3. 純資産総額 £20,000.01 ~ £50,000 - 40%
  4. 純資産総額 £50,000.01 + - 45%

例えば

NetWorthが 100000 の場合、計算は次のようになります。

  1. 100000 の最初の 5000 の場合、手数料は 30% です。つまり、5000 * 0.30 = 1500 が除外されます (95000)
  2. 95000 の次の 20000 では、手数料は 35% です。つまり、20000 * 0.35 = 7000 が除外されます (75000)
  3. 75000 の次の 50000 では、手数料は 40% です。つまり、50000 * 0.40 = 20000 が除外されます (25000)
  4. 省略された 25000 の場合、手数料は 45%、つまり 25000 * 0.45 = 11250 です。

このすべてのコミッションの合計 = ポイント 1 + ポイント 2 + ポイント 3 + ポイント 4 = 1500 + 7000 + 20000 + 11250 = 39750

以下は、私が書いたストアドプロシージャのコードです。これを改善できるか、または別の書き方があれば教えてください。

DECLARE @NetWorth DECIMAL(18, 2) 
DECLARE @InterMediateTier1Value DECIMAL(18, 2) 
DECLARE @InterMediateTier2Value DECIMAL(18, 2) 
DECLARE @InterMediateTier3Value DECIMAL(18, 2) 
DECLARE @InterMediateTier1Commission DECIMAL(18, 2) 
DECLARE @InterMediateTier2Commission DECIMAL(18, 2) 
DECLARE @InterMediateTier3Commission DECIMAL(18, 2) 
DECLARE @RemainderCommission DECIMAL(18, 2) 
DECLARE @RemainderValue DECIMAL(18, 2) 

SET @NetWorth = 40000 

DECLARE @TotalCommission DECIMAL(18, 2) 

IF @NetWorth <= 5000 
  BEGIN 
      SET @InterMediateTier1Commission = @NetWorth * 0.30 
      SET @TotalCommission = @InterMediateTier1Commission 
  END 
ELSE IF @NetWorth > 5000 
   AND @NetWorth <= 20000 
  BEGIN 
      SET @InterMediateTier2Value = @NetWorth - 5000 
      SET @InterMediateTier1Commission = 5000 * 0.30 
      SET @InterMediateTier2Commission = @InterMediateTier2Value * 0.35 
      SET @TotalCommission = @InterMediateTier1Commission 
                             + @InterMediateTier2Commission 
  END 
ELSE IF @NetWorth > 20000 
   AND @NetWorth <= 50000 
  BEGIN 
      SET @InterMediateTier1Value = @NetWorth - 5000 
      SET @InterMediateTier1Commission = 5000 * 0.30 

      IF @InterMediateTier1Value > 20000 
        SET @RemainderValue = @InterMediateTier1Value - 20000 

      SET @RemainderCommission = @RemainderValue * 0.40 
      SET @InterMediateTier2Commission = 20000 * 0.35 
      SET @TotalCommission = @InterMediateTier1Commission 
                             + @InterMediateTier2Commission 
                             + @RemainderCommission 
  END 
ELSE IF @NetWorth > 50000 
  BEGIN 
      SET @InterMediateTier1Value = @NetWorth - 5000 
      SET @InterMediateTier1Commission = 5000 * 0.30 

      IF @InterMediateTier1Value > 20000 
        SET @RemainderValue = @InterMediateTier1Value - 20000 

      SET @InterMediateTier2Commission = 20000 * 0.35 

      IF @RemainderValue > 50000 
        SET @InterMediateTier4Value = @RemainderValue - 50000 

      SET @InterMediateTier3Commission = 50000 * 0.40 
      SET @RemainderCommission = @RemainderValue * 0.45 
      SET @TotalCommission = @InterMediateTier1Commission 
                             + @InterMediateTier2Commission 
                             + @InterMediateTier3Commission 
                             + @RemainderCommission 
  END 

SELECT @TotalCommission AS TotalCommission 
4

2 に答える 2

3

はい、これは改善できます。「NetWorth」の金額と手数料をテーブルに入れ、SQL を使用して作業を行います。

declare @Comm table (
    NetworthLower float,
    NetWorthHigher float,
    Commission float
);

insert into @comm
    select 0, 5000, 0.30 union all
    select 5000, 20000, 0.35 union all
    select 20000, 50000, 0.4 union all
    select 50000, NULL, 0.45

declare @Value float = 8000;

select SUM(case when @Value >= c.NetWorthLower and @Value < coalesce(c.NetWorthHigher, @Value)
                then (@Value - c.NetWorthLower) * c.Commission
                when  @Value >= c.NetWorthLower
                then (c.NetWorthHigher - c.NetworthLower) * c.Commission
                else 0.0
           end)
from @Comm c 

これにより、ストアド プロシージャを使用しなくても、テーブル全体の手数料を計算することもできます。

于 2012-09-04T22:14:36.887 に答える
1

これを試してください。以下のテストケースで機能することがわかりました

テスト ケース 1 :DECLARE @NetWorth DECIMAL(18, 2) = 1000

テスト ケース 2 :DECLARE @NetWorth DECIMAL(18, 2) = 9999

テスト ケース 3: DECLARE @NetWorth DECIMAL(18, 2) = 40000

テスト ケース 4: DECLARE @NetWorth DECIMAL(18, 2) = 78000

クエリ

DECLARE @NetWorth DECIMAL(18, 2)  = 488000  

SELECT TotalCommission = 
CONVERT(DECIMAL(18, 2),

    CASE WHEN @NetWorth <= 5000 THEN @NetWorth * 0.30 
            WHEN @NetWorth > 5000  AND @NetWorth <= 20000 THEN (5000 * 0.30) + (@NetWorth - 5000) * 0.35 
            WHEN @NetWorth > 20000 AND @NetWorth <= 50000 
                                THEN CASE WHEN ((@NetWorth - 5000) > 20000)
                                            THEN (5000 * 0.30)  + 
                                                (20000 * 0.35)  +  
                                                ((@NetWorth - 5000)- 20000)* 0.40
                                            ELSE (5000 * 0.30)+ (20000 * 0.35)
                                        END
        WHEN @NetWorth > 50000 
                                THEN CASE WHEN ((@NetWorth - 5000) > 20000)
                                            THEN (5000 * 0.30) +
                                                (20000 * 0.35) + 
                                                (50000 * 0.40) +
                                                ((@NetWorth - 5000) - 20000 )*0.45
                                            ELSE (5000 * 0.30) + (20000 * 0.35) + (50000 * 0.40)
                                    END


    END
)

お役に立てれば。いずれにせよ失敗した場合はお知らせください。

于 2012-09-05T03:22:04.703 に答える