2014-10-16 167 views
1

我有一些學生在年底被授予A到E的成績。我發現使用以下SQL按評估代碼對已獲得成績的學生進行分組的百分比。SQL即使沒有數據也會返回行

SELECT '2014' as FileYear, 
    AssessmentCode, 
    AssessResultsResult as Grade, 
    cast(count(*)*100.0/sum(count(*)) over (partition by assessmentcode) as decimal(5,2))as GradePerc 
FROM vStudentReportsSemesterResults 
WHERE (FileYear = 2014) 
    AND (FileSemester = 2) 
    AND (AssessmentCode like '11%') 
    AND (AssessAreaHdgAbbrev2 = 'FinalGrade') 

    group by AssessmentCode, 
    AssessResultsResult 

order by assessmentcode 

這工作完全和回報......

FileYear AssessmentCode Grade GradePerc 
    2014  11CPSIPT  NULL  100 
    2014  11CPSSDD  A  11.76 
    2014  11CPSSDD  B  47.06 
    2014  11CPSSDD  C  41.18 
    2014  11DRADRA  NULL  100 
    2014  11GEOGEO  A  6.25 
    2014  11GEOGEO  B  56.25 
    2014  11GEOGEO  C  28.13 
    2014  11GEOGEO  D  9.38 
    2014  11HISANC  NULL  100 

注意一些評估代碼還沒有(在列級NULL)提交成績尚未和其他人提交的成績,但沒有學生例如,他們被授予D或E。

是否有返回,即使成績沒有被授予數據的方式提交或尚未如

FileYear AssessmentCode Grade GradePerc 
    2014  11CPSIPT  A  0 
    2014  11CPSIPT  B  0 
    2014  11CPSIPT  C  0 
    2014  11CPSIPT  D  0 
    2014  11CPSIPT  E  0 
    2014  11CPSSDD  A  11.76 
    2014  11CPSSDD  B  47.06 
    2014  11CPSSDD  C  41.18 
    2014  11CPSSDD  D  0 
    2014  11CPSSDD  E  0 
    2014  11DRADRA  A  0 
    2014  11DRADRA  B  0 
    2014  11DRADRA  C  0 
    2014  11DRADRA  D  0 
    2014  11DRADRA  E  0 
    2014  11GEOGEO  A  6.25 
    2014  11GEOGEO  B  56.25 
    2014  11GEOGEO  C  28.13 
    2014  11GEOGEO  D  9.38 
    2014  11GEOGEO  E  0 

我想圖此信息,並想知道,如果一個等級還沒有被授予等

感謝您的幫助。實現上述結果

+0

有多種可能的方法,而我是一個不寫出正確答案的壞人。結束語:嘗試在查詢中添加['WITH ROLLUP'](http://technet.microsoft.com/library/ms189305),並查看是否無法將結果篩選到您想要的結果。 – 2014-10-16 13:09:06

回答

1

一種方法是

WITH Results(FileYear, AssessmentCode ,Grade, GradePerc) 
AS 
(
SELECT 
    '2014' AS FileYear, 
    AssessmentCode, 
    AssessResultsResult as Grade, 
    CAST(COUNT(*)*100.0/SUM(COUNT(*)) OVER (PARTITION BY assessmentcode) AS DECIMAL(5,2))AS GradePerc 
FROM 
    vStudentReportsSemesterResults 
WHERE 
    (FileYear = 2014) 
    AND 
    (FileSemester = 2) 
    AND 
    (AssessmentCode like '11%') 
    AND 
    (AssessAreaHdgAbbrev2 = 'FinalGrade') 
GROUP BY 
    AssessmentCode, 
    AssessResultsResult 
), 
MyGrades(Grade) 
AS 
(
SELECT 
    'A' 
UNION ALL 
SELECT 
    'B' 
UNION ALL 
SELECT 
    'C' 
UNION ALL 
SELECT 
    'D' 
UNION ALL 
SELECT 
    'E' 
), 
FinalResults(FileYear, AssessmentCode, Grade, GradePerc) 
AS 
(
    SELECT 
     FileYear, 
     AssessmentCode, 
     CASE WHEN Results.Grade IS NULL THEN MyGrades.Grade ELSE Results.Grade END AS Grade, 
     CASE WHEN Results.Grade IS NULL THEN 0 ELSE Results.GradePerc END AS GradePerc 
    FROM 
     Results 
     LEFT JOIN MyGrades 
      ON Results.Grade IS NULL 
    UNION ALL 
    SELECT 
     FileYear, 
     AssessmentCode, 
     MyGrades.Grade, 
     0 AS GradePerc 
    FROM 
     MyGrades 
     LEFT JOIN Results 
      ON Results.Grade != MyGrades.Grade 
) 

SELECT 
    FileYear, 
    AssessmentCode, 
    Grade, 
    MAX(GradePerc) AS GradePerc 
FROM 
    FinalResults 
GROUP BY 
    FileYear, 
    AssessmentCode, 
    Grade 
ORDER BY 
    AssessmentCode 
    ; 
+0

感謝保羅,爲您提供幫助 - 完美運作。我不得不擺脫它不喜歡的AssessmentCode聲明。一旦註釋,它運作良好。 – Barrelnc 2014-10-17 01:39:01

+0

糟糕 - 跳了一下槍。對於沒有輸入等級的科目,它可以很好地工作,但對於輸入等級的科目,它會輸入輸入等級的百分比,但是對於未輸入等級的成績也不會增加零。例如上面的11CPSSDD沒有D和E的行仍然...任何想法? – Barrelnc 2014-10-17 01:57:44

+0

嘿保羅,試圖讓上述工作正常嗎? – Barrelnc 2014-10-20 03:35:45

0

如果你可以操縱數據庫對象...

我不知道你的表結構是什麼樣子,但我會建議您創建一個表來存儲您可能的成績(A到E)並使vStudentReportsSemesterResults.AssessResultsResult成爲一個外鍵列。 (因爲這看起來像是一個視圖而不是表格,所以你需要用底層表格來做這件事。)現在你可以外連接到你的新表格並獲得該表格中每個值的結果。作爲獎勵,如果您從「E」更改爲「F」或分級系統更改,則無需調整查詢,因爲沒有硬編碼的內容。

如果你不能操縱數據庫對象...

你可以做一個存儲過程(或腳本)的這個查詢部分,並創建一個臨時表(或局部表變量),並加入針對。但這個概念還是一樣的。

相關問題