UDF计算分数 - 输入在预定义参数上评分

时间:2013-09-08 07:25:45

标签: sql sql-server user-defined-functions

我正在尝试创建一个SQL Server用户定义函数(UDF),它计算得分并在表创建过程中应用该函数。

该表格包含以下列:

MemberID(PK)
Gender 
Name
DOB
Weight
Height
SmokingHabit
Salary
CalculatedScore

计算得分是根据

以下各个人得分的总和计算出来的

参数

年龄

  • 如果年龄在20-30之间,则得分为5
  • 如果年龄介于31-40之间,则得分为4
  • 如果年龄在41-50之间,则得分为3
  • 如果年龄> 50,则得分为2

体重(kg)/身高(m)

  • 如果它在20-25之间得分为1
  • 如果在25-30之间得分为3
  • 如果在30-35之间得分为5
  • 如果在35-40之间得分为2

吸烟者

  • 如果吸烟者状态为YES,则得分为0
  • 如果吸烟者状态为NO,则得分为5

薪酬

  • 如果薪水低于$ 50k,则得分为1
  • 如果薪水为50k-60k,则得分为2
  • 如果薪水为60k-70k,则得分为3
  • 如果薪水大于70k,则得分为4

我完全不知道如何编写代码,我已经开始使用

CREATE FUNCTION [dbo].[FCupid]
( 
    @gender YES/NO, 
    @name varchar(15), 
    @dob datetime, 
    @weight int, 
    @height int, 
    @smoker Yes/NO, 
    @salary int
)

RETURNS @Member table
AS
BEGIN

    INSERT @Member ( @gender, @name, @dob, @weight, @height, @smoker, @salary)
    SELECT m.gender, m.dob, m.weight, m.height, m.smoker, m.salary,

然后我挣扎。

任何形式的帮助都将受到赞赏

1 个答案:

答案 0 :(得分:0)

我会创建一个只将得分作为INT返回的函数,如下所示:

CREATE FUNCTION [dbo].[FCupid]
   (@gender CHAR(1), @name varchar(15), @dob datetime, 
    @weight int, @height int, @smoker BIT, @salary int)
RETURNS INT
AS
BEGIN
    DECLARE @Score INT

    -- determine age in years    
    DECLARE @Age INT
    SELECT @Age = DATEDIFF(YEAR, @dob, GETDATE())

    SELECT 
        @Score = CASE 
                    WHEN @Age BETWEEN 20 AND 30 THEN 5
                    WHEN @Age BETWEEN 31 AND 40 THEN 4
                    WHEN @Age BETWEEN 41 AND 50 THEN 3
                    WHEN @Age > 50 THEN 2
                    ELSE 0
                END

    -- determine weight/height ratio - this should be **DECIMAL**, though - not INT !!      
    DECLARE @WeightHeight INT

    SET @WeightHeight = @Weight / @height

    SET 
       @Score = @Score + 
                CASE 
                  -- what if that ratio is **below** 20 ???
                  WHEN @WeightHeight BETWEEN 20 AND 25 THEN 1
                  WHEN @WeightHeight BETWEEN 25 AND 30 THEN 3
                  WHEN @WeightHeight BETWEEN 30 AND 35 THEN 5
                  WHEN @WeightHeight BETWEEN 35 AND 40 THEN 2
                  ELSE 0  
                END

    -- add five points if non-smoker    
    IF @Smoker = 0
        SET @Score = @Score + 5

    -- determine score by salary    
    SET 
       @Score = @Score + 
                CASE 
                   WHEN @Salary < 50000 THEN 1
                   WHEN @Salary BETWEEN 50001 AND 60000 THEN 2
                   WHEN @Salary BETWEEN 60001 AND 70000 THEN 3
                   WHEN @Salary > 70000 THEN 4
                END


    RETURN @Score
END

这样,您可以使用手头的所有值调用此函数,并让它确定您可以根据需要用于插入表中的Score

另外作为旁注:我认为体重和身高应该是DECIMAL(10,2)或类似的东西 - 而不是INT。你怎么用INT来表达1.86米的高度? 1?还是2?并且该比率的CASE语句还应该处理其值低于20或超过40的情况 - 即使在该情况下它只是使用0作为分数(但应该明确定义)。

更新:如果要将数据插入表格,可以使用此功能:

INSERT INTO dbo.YourTable(Name, Gender, DateOfBirth, ...., Score)
   SELECT
       @Name, @Gender, @dob, .....,
       dbo.FCupid(@Gender, @Name, @dob, .........)

基本上,您可以在SELECT中调用此函数,就好像它是一个列(或多或少)