コミッション計算機を作成していますが、どうすればよいかわかりません。次のような状況があります: 顧客 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