2014-11-06 10 views
0

在MS-SQL中,我有一個表hasStudied(sid,ccode,等級)(學號,課程代碼,等級),用於跟蹤學生學習過去的課程和他們已經得到的等級。將錶轉換爲同一表的分組統計

作爲我的查詢的輸出結果,我希望返回一列課程列表,旁邊列中傳遞(=不是'F')學生的百分比,按百分比降序排列,如下所示:

C1 : 85 
C3 : 70 
C2 : 67 

目前我已設法將它們分解成兩個單獨的表,一個包含coursecode和人民傳遞過程中一個包含coursecode的數量,和誰已經閱讀課程的人數。

這是通過兩個相對簡單的語句來完成的,但需要我在java中做很多低效的計算。

有什麼辦法可以在單個查詢中做到這一點?

回答

0

假設你沒有下一個過程的兩個條目具有相同的學生,這應該這樣做:

SELECT 
ccode, 
ROUND((passed::numeric(15,2)/taken_course::numeric(15,2)) * 100, 0) AS percentage_passed 
FROM(
    SELECT 
    ccode, 
    sum(CASE WHEN grade > 2 THEN 1 ELSE 0 END) AS passed, 
    count(1) AS taken_course 
    FROM 
    hasStudied 
    GROUP BY ccode 
    ) foo 
ORDER BY ccode 
-- since you want to order DESC by values, instead do 
-- ORDER BY percentage_passed 
+0

謝謝你的回覆:)你是在假設正確的,學生不能讀同一課程幾次。 因爲我的成績存儲爲字符串A-F,所以我認爲我可以將grade> 2換成grade!='f'。但是即使這樣做,我沒有得到這個查詢正確執行,我得到了一個錯誤消息「類型傳遞不是一個定義的系統類型」。 我仍然不太瞭解如何通過::數字(15,2)線的作品,但我會做一些閱讀主題:) – gogan111 2014-11-06 12:40:20

+0

@ gogan111讓我知道它是否有效。如果沒有 - 請提供架構表和一些示例數據以測試案例,以便我可以按預期工作。 – 2014-11-10 21:23:20