2

gpa がコースのクレジットをスコアで乗算した結果を取得するためのストアド プロシージャがあります。

ALTER PROCEDURE dbo.GpaCreditFromScore
(
    @score INT,
    @credits INT, 
    @gpaCredit INT OUTPUT
)
AS 
IF (@score < 60)
BEGIN
    SET @gpaCredit = 0.0
END
ELSE IF (@score < 62)
BEGIN
    SET @gpaCredit = 1.0 * @credits
END
ELSE IF (@score < 65)
BEGIN
    SET @gpaCredit = 1.7 * @credits
END
ELSE IF (@score < 67)
BEGIN
    SET @gpaCredit = 2.0 * @credits
END
ELSE IF (@score < 70)
BEGIN
    SET @gpaCredit = 2.3 * @credits
END
ELSE IF (@score < 75)
BEGIN
    SET @gpaCredit = 2.7 * @credits
END
ELSE IF (@score < 80)
BEGIN
    SET @gpaCredit = 3.0 * @credits
END
ELSE IF (@score < 85)
BEGIN
    SET @gpaCredit = 3.3 * @credits
END
ELSE IF (@score < 90)
BEGIN
    SET @gpaCredit = 3.7 * @credits
END
ELSE IF (@score < 95)
BEGIN
    SET @gpaCredit = 4.0 * @credits
END
ELSE IF (@score <= 100)
BEGIN
    SET @gpaCredit = 4.3 * @credits
END

そして、すべての学生の gpa を計算する別のストアド プロシージャは、単位を乗算します。

ALTER PROCEDURE dbo.ComputeGpa
AS
    ;WITH x AS 
(
  SELECT StudentID, Score, rn = ROW_NUMBER() OVER 
   (PARTITION BY StudentID, CourseID 
    ORDER BY Semester DESC) 
  FROM dbo.UndergraduateScoreSet
)
SELECT StudentID, Gpa /* call dbo.GpaCreditFromScore here to get @gpaCredit */
FROM x
WHERE rn = 1
GROUP BY StudentID;

ロジックがかなり複雑なので、これを達成する方法がわかりません。助けてください〜

4

2 に答える 2

2

悲しいことに、プロシージャ dbo.GpaCreditFromScore はスカラー パラメータを取得して返すため、カーソルのような恐ろしいものを使用して、すべてのスコアを計算するために学生を反復処理する必要があることを意味します。

@Damienが言及しているdbo.GpaCreditFromScoreように、次のようにユーザー定義関数に変更する必要があります。

CREATE FUNCTION dbo.GpaCreditFromScore
(
    @score INT,
    @credits INT 
)
RETURNS INT 
AS 
    BEGIN
        DECLARE @gpaCredit INT
        IF (@score < 60)
        BEGIN
            SET @gpaCredit = 0.0
        END
        ELSE IF (@score < 62)
        BEGIN
            SET @gpaCredit = 1.0 * @credits
        END
        ELSE IF (@score < 65)
        BEGIN
            SET @gpaCredit = 1.7 * @credits
        END
        ELSE IF (@score < 67)
        BEGIN
            SET @gpaCredit = 2.0 * @credits
        END
        ELSE IF (@score < 70)
        BEGIN
            SET @gpaCredit = 2.3 * @credits
        END
        ELSE IF (@score < 75)
        BEGIN
            SET @gpaCredit = 2.7 * @credits
        END
        ELSE IF (@score < 80)
        BEGIN
            SET @gpaCredit = 3.0 * @credits
        END
        ELSE IF (@score < 85)
        BEGIN
            SET @gpaCredit = 3.3 * @credits
        END
        ELSE IF (@score < 90)
        BEGIN
            SET @gpaCredit = 3.7 * @credits
        END
        ELSE IF (@score < 95)
        BEGIN
            SET @gpaCredit = 4.0 * @credits
        END
        ELSE IF (@score <= 100)
        BEGIN
            SET @gpaCredit = 4.3 * @credits
        END
        RETURN @gpaCredit
    END

Stored Proc はうまく機能しません (クレジットはどこから来るのですか?) が、次のように CTE のフィールドで UDF を使用することを考えています。

ALTER PROCEDURE dbo.ComputeGpa
AS
    ;WITH x AS 
    (
      SELECT StudentID, Score, 9 AS Credits, rn = ROW_NUMBER() OVER 
       (PARTITION BY StudentID, CourseID 
        ORDER BY Semester DESC) 
      FROM dbo.UndergraduateScoreSet
    )
    SELECT StudentID, dbo.GpaCreditFromScore(Score, Credits) AS GpaCredit
    FROM x
    WHERE rn = 1
    GROUP BY StudentID; 

EDIT OP でバグが発見されました - GROUP BY のため、もちろん集約が必要です。ありがとう!:

    SELECT StudentID, SUM(dbo.GpaCreditFromScore(Score, Credits)) AS GpaCredit
于 2012-08-10T06:24:01.527 に答える
0

これはあなたに役立つかもしれません

ネストされたストアド プロシージャの結果を使用して、ストアド プロシージャ Sql Server 2008 を呼び出す

このように使用できます

IF .....
INSERT #Tbl (Fields)
EXEC usp_SelectProc1 @Arg1, Arg2...Argn
ELSE
INSERT #Tbl (Fields)
EXEC usp_SelectProc2 @Arg1, Arg2...Argn
于 2012-08-10T06:51:20.657 に答える