2016-03-06 47 views
-1

我想獲得pointsEarned列的總和和pointsPossible列的總和。我想把它變成一個百分比。我的問題是,我的SP總是返回0,即使在有給定enrollmentId的行具有先前列的值時也是如此。爲什麼我的存儲過程返回0?

我在做什麼錯?

ALTER PROCEDURE GetPercentage 
    @enrollmentId int 
AS 
BEGIN 
    DECLARE @pointsEarned int; 
    DECLARE @pointsPossible int; 

    SET NOCOUNT ON; 

    SELECT 
     @pointsEarned = CAST(SUM(pointsEarned) OVER() AS decimal), 
     @pointsPossible = CAST(SUM(pointsPossible) OVER() AS decimal) 
    FROM 
     Assignments 
    WHERE 
     enrollmentId = @enrollmentId 

    RETURN @pointsEarned/@pointsPossible 
END 
GO 

這是數據庫表:

enter image description here

我執行存儲過程和在69的enrollmentId傳遞,它仍然返回0

+1

我會擺脫回報,並用SELECT – JVM

+0

取代它顯示你的'exec'腳本 –

+0

爲什麼你會擺脫回報,代之以一個' select'?它不能解決問題並完全改變SP的使用。 –

回答

2

整數用分母除法(pointsPossible )大於分子(pointsEarned)返回零。

寫爲(修訂):

ALTER PROCEDURE GetPercentage 
    @enrollmentId int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     Percent = case when sum(pointsPossible) > 0 then (1.0 * sum(pointsEarned))/sum(pointsPossible) else 0 end 
    FROM 
     Assignments 
    WHERE 
     enrollmentId = @enrollmentId 
    GROUP BY 
     enrollmentId 
END 
GO 

正如@ Nick.McDermaid指出,因爲這個過程會返回一個標值,它可能更適合將它定義爲一個函數,而不是一個存儲過程。

1
  1. 使用簡單SUM沒有OVER

  2. RETURN只能返回int。如果您的百分比低於100%,則整數除法將始終返回0,因此乘以100將返回整個百分比而不是比率。

  3. 檢查你沒有被零除。

程序

ALTER PROCEDURE GetPercentage 
    @enrollmentId int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @pointsEarned int; 
    DECLARE @pointsPossible int; 

    SELECT 
     @pointsEarned = SUM(pointsEarned), 
     @pointsPossible = SUM(pointsPossible) 
    FROM 
     Assignments 
    WHERE 
     enrollmentId = @enrollmentId 
    ; 

    RETURN 
     CASE WHEN @pointsPossible <> 0 
     THEN 100 * @pointsEarned/@pointsPossible 
     ELSE 0 END; 

END 
GO 
+0

http://stackoverflow.com/questions/19271646/how-to-make-a-sum-without-group-by –

+0

@MitchWheat,我想我知道什麼'SUM()OVER()'做。如果我正確地理解了這個問題,OP需要一個普通的總和(一行中的一個數字),而不是多行中的總和。 –

+0

你的意思就像我發佈的答案?但關於RETURN的好處只能返回一個int。 –