2014-10-16 168 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”或分级系统更改,则无需调整查询,因为没有硬编码的内容。

如果你不能操纵数据库对象...

你可以做一个存储过程(或脚本)的这个查询部分,并创建一个临时表(或局部表变量),并加入针对。但这个概念还是一样的。

相关问题