1

コミッション計算機を作成していますが、どうすればよいかわかりません。次のような状況があります: 顧客 123 の salesRep A は、最初の 2 年間は 2%、その後は 0.5% になります。私はすでに顧客の年齢を取得する方法を知っています。

また、日付範囲は可変です。1 つの salesRep/Customer の組み合わせが 1 年、2 年、いつでも、おそらくその年に分割される可能性があることを意味します。

では、これを照会して保存するにはどうすればよいでしょうか。現在、私のコミッション テーブルは次のようになっていますが、変更する必要がありますか?

    CREATE TABLE [dbo].[NCL_Commissions](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ProductType] [varchar](255) NULL,
    [LowCost] [int] NULL,
    [HighCost] [int] NULL,
    [CustCode] [varchar](30) NULL,
    [SalesRep] [varchar](10) NULL,
    [Commission] [float] NULL,
    [MinAge] [smallint] NULL,
    [MaxAge] [smallint] NULL,
 CONSTRAINT [PK_NCL_Commissions] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

すべての手数料が同じであると言われたときに私がそれを構築した方法は次のとおりです。

  DECLARE @custCreationDate datetime

    SET @custCreationDate = (   SELECT TOP 1 cast(INVDate as datetime)
                                FROM InvoiceHeader
                                WHERE companycode = @custCode
                                order by recid asc      )

--  PRINT 'Line 54: @custCreationDate: ' + cast(@custCreationDate as varchar)

    --If the customer has existed for less than a year
    IF @custCreationDate > DateAdd(yy, -1, @now)
        BEGIN
            SET @result = 2.00  --Customers in existance for less than a year yeild 2% commission
--          PRINT 'Line 60 - @result: ' + cast(@result as varchar)
            GOTO Exit_Function
        END
    ELSE
        BEGIN
            SET @result = 0.50  --Customers in existance longer yeild 0.5 % commission.
--          PRINT 'Line 66 - @result: ' + cast(@result as varchar)
            GOTO Exit_Function
        END

サンプルデータ(質問の一部は、保存方法に関する提案を探しています)

営業担当者 A の顧客 123 は、最初の 2 年間で 0.5% よりも 1% を
取得します 営業担当者 B の顧客 456 は、最初の 1 年間で 0.75% よりも 2% を取得します

いつでも、顧客の現在の年齢に基づいて正しいパーセンテージを取得できなければなりません。したがって、顧客 A が 2012 年 6 月 1 日に作成された場合、手数料は 2% です。顧客が 2008 年 9 月 5 日に作成された場合、手数料は 0.5% です。

ソリューション ゴードン リノフの回答に基づく:

SET @custAgeInMonths = datediff(month, @custCreationDate, @invDate)

    --First look for a customer specific record
    SELECT @result = C.Commission
    FROM NCL_Commissions C
    WHERE C.CustCode = @custCode
    AND C.SalesRep = @salesRep
    AND ProductType in ('L')
    AND @custAgeInMonths BETWEEN C.MinAgeMonths AND C.MaxAgeMonths
4

2 に答える 2

1

これは結合のようです。

顧客テーブルがあり、顧客の開始日と上記のコミッション テーブルがあるとします。顧客の現在の年齢を計算し、手数料テーブルに参加できます。これは、顧客レコードに営業担当者がいると仮定しています。

select <whatever>
from (select c.*, datediff(day, c.joindate, getdate())/365.25 as AgeYears
      from customer c
     ) c left outer join
     NCL_Commissions com
     on c.CustCode = com.CustCode and
        c.ProductType= com.ProductType and
        c.SalesRep = com.SalesRep and
        c.AgeYears between MinAge and c.MaxAge

すべての結合基準を考えると、不一致に注意します (したがって、左外部結合を使用します)。

于 2012-08-10T15:30:34.083 に答える
0

1) コミッションブラケットを含むテーブルが必要です (月ごとをお勧めします)

CREATE TABLE [dbo].[CommissionsBrakets](
[ID] [int] NOT NULL,
[Commission] [Decimal](4, 4) NULL,
Month [smaillint])

ブレーキで埋めます

1    2%  1 /month 1 2%
1    2%  2 /month 2 2%
....
1  0.5% 24 /month 24 (2 years) 0.5%

2) costumer+salesrep+comisionBracket に関連するテーブルが必要です

CREATE TABLE [dbo].[NCL_Commissions](
[ID] [int] IDENTITY(1,1) NOT NULL,   
[CustCode] [varchar](30) NULL,
[SalesRep] [varchar](10) NULL,
[CommissionID] [int] NULL)

その後、結合を行うことができます

declare @mothDiff int = DATEDIFF(m, @custCreationDate, GETDATE())


Select b.Commission from NCL_Commissions C inner join CommissionsBrakets B 
on c.CommissionID  =   B.ID 
where 
B.month = case 
    when @mothDiff > ((select max(Month) from CommissionsBrakets CB where CB.id = B.ID   ))
    then (select max(Month) from CommissionsBrakets CB where CB.id = B.ID   )
    else @mothDiff
    end
于 2012-08-10T15:50:53.730 に答える