【问题标题】:Can I use If in a UDF?我可以在 UDF 中使用 If 吗?
【发布时间】:2015-09-29 06:27:55
【问题描述】:

我有一个任务,我应该使用标量 UDF 来实现一个业务规则,该规则声明所有报价值都会吸引以下佣金:

• 第一季度(1 月至 3 月)10% 佣金

• 第二季度(4 月 - 6 月)15% 佣金

• 第二季度(7 月至 9 月)20% 佣金

• 第四季度(10 月至 12 月)25% 佣金

UDF 函数应接受报价值,计算佣金并返回要支付给员工的佣金。

我有一张名为 Campaign Offer 的表格。

Create Table Campaign_Offer
(
       Offer_id         integer identity(1,1) primary key,

       Offer_date           Date        ,

       Customer_id          int ,

       Offer_value          money       ,

       Product_name     varchar(20) ,

       Acceptance_status    varchar(3)  ,

       Employee_ID          char(10)    ,

    Constraint CustomerID foreign key (Customer_id) references marketing_list(Id),
    Constraint EmployeeID foreign key (Employee_ID) references Employee(Employee_id),
    Constraint AcceptanceStatus Check (Acceptance_status in ('yes', 'no'))
)

我想在这里做

Create Function OfferCommission (@OfferValue money,@OfferDate date)
Returns money
As
Begin
if @OfferDate between '01/01/2015' and '03/31/2015'
Begin
Return @OfferValue*0.1
End
else
if @OfferDate between '04/01/2015' and '06/31/2015'
Begin
Return @OfferValue*0.15
End
else
if @OfferDate between '07/01/2015' and '09/31/2015'
Begin
Return @OfferValue*0.2
End
else
if @OfferDate between '09/01/2015' and '12/31/2015'
Begin
Return @OfferValue*0.25
End
End

【问题讨论】:

  • Case 比 if for your case 好很多

标签: sql-server user-defined-functions


【解决方案1】:

您可以使用CASE

Create Function OfferCommission (@OfferValue money,@OfferDate date)
Returns money
As
Begin
 DECLARE @result MONEY;

 SELECT @result = 
   CASE 
    WHEN @OfferDate between '01/01/2015' and '03/31/2015' THEN @OfferValue * 0.1
    WHEN @OfferDate between '04/01/2015' and '06/31/2015' THEN @OfferValue * 0.15
    WHEN @OfferDate between '07/01/2015' and '09/31/2015' THEN @OfferValue * 0.2
    WHEN @OfferDate between '09/01/2015' and '12/31/2015' THEN @OfferValue * 0.25
    ELSE NULL
    END;

  RETURN @result;
END

您可以使用 CHOOSESQL SERVER 2012+ 提供更短的解决方案。

Create Function OfferCommission (@OfferValue money,@OfferDate date)
Returns money
As
Begin
 RETURN @OfferValue * CHOOSE(DATEPART(QUARTER,@OfferDate), 0.1, 0.15, 0.2, 0.25) 
END

【讨论】:

  • 谢谢伙计..看起来它可以工作..当我在这里..假设我想做同样的事情,除了开发一个不接受任何值的表格 UDF 并计算每个值的佣金员工编号?
  • @user2127184 使用选择以获得更短的解决方案
  • @user2127184 你不需要表格 UDF,简单的选择就像SELECT *, OfferValue_Column_Name * CHOOSE(DATEPART(QUARTER,OfferDate_Column_Name), 0.1, 0.15, 0.2, 0.25) AS alias_name FROM your_table
  • 不错的解决方案,+1 CHOOSE
  • 再次感谢@lad2025。我知道我不需要表格。我只是想看看它是如何工作的,因为这是一项任务。谁知道也许以后我会被要求使用表格 udf
【解决方案2】:

最好的方法是使用 DATEPART 函数来确定季度 - 这很完美:

CREATE FUNCTION OfferCommission (@OfferValue money, @OfferDate date)
RETURNS MONEY
AS
BEGIN
    RETURN CASE  DATEPART(QUARTER,@OfferDate)
        WHEN 1 THEN @OfferValue * 0.1
        WHEN 2 THEN @OfferValue * 0.15
        WHEN 3 THEN @OfferValue * 0.2
        WHEN 4 THEN @OfferValue * 0.25
    END
END
GO

【讨论】:

  • @很好的答案,我借用你的 DATEPART 提示并结合 CHOOSE 功能更短 +1 stackoverflow.com/a/32837286/5070879 :)
  • 不错的 - 谢谢!请记住CHOOSE 在 SQL Server 2012 之前不存在..
【解决方案3】:

您可以尝试在下面使用CASE 而不是IF

CREATE FUNCTION OfferCommission (@OfferValue MONEY, @OfferDate DATE)
RETURNS MONEY
AS
BEGIN
    RETURN CASE WHEN @OfferDate BETWEEN '01/01/2015' AND '03/31/2015' THEN @OfferValue*0.1
                WHEN @OfferDate BETWEEN '04/01/2015' AND '06/31/2015' THEN @OfferValue*0.15
                WHEN @OfferDate BETWEEN '07/01/2015' AND '09/31/2015' THEN @OfferValue*0.2
                WHEN @OfferDate BETWEEN '09/01/2015' AND '12/31/2015' THEN @OfferValue*0.25
            END
END

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多