1

我正在尝试创建一个 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

吸烟者

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

薪水

  • 如果薪水低于 5 万美元,则得分为 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,

然后我挣扎。

任何形式的帮助将不胜感激

4

1 回答 1

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。您将如何仅用一个 ? 表示 1.86m 的高度INT?1?还是2?并且该CASE比率的声明还应该处理它的值低于 20 或超过 40 的情况——即使在这种情况下它只是使用 0 作为分数(但应该明确定义)。

更新:如果你想将数据插入到表中,你可以像这样使用这个函数:

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

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

于 2013-09-08T08:24:14.200 回答