SQL 使用分组聚合函数

SQL Aggregate functions with groupings

我需要创建一些检查以确保学生注册了具有正确单元数的正确课程。这是我现在的 SQL。

  SELECT StudentID
  ,AssessmentCode
  ,BoardCode
  ,BoardCategory
  ,BoardUnits
  ,sum(cast(boardunits as int)) over (partition by studentid,boardcategory) as UnitCount
  ,Count(boardcategory) over (partition by studentid)  as SubjectCount
FROM uvNCStudentSubjectDetails
where fileyear = 2015 
and filesemester = 1
and studentyearlevel = 11 
and StudentIBFlag = 0
order by Studentnameinternal,BoardCategory

这给了我以下信息...

StudentID   AssessmentCode  BoardCode   BoardCategory   BoardUnits  UnitCount   SubjectCount
61687       11TECDAT        11080             A             2          11           7
61687       11PRS1U         11350             A             1          11           7
61687       11MATGEN        11235             A             2          11           7
61687       11LANGRB        11870             A             2          11           7           
61687       11ENGSTD        11130             A             2          11           7
61687       11GEOGEO        11190             A             2          11           7
64549       11TECIND        11200             A             2          10           7
64549       11SCIPHY        11310             A             2          10           7
64549       11SCIEAE        11100             A             2          10           7
64549       11MATGEN        11235             A             2          10           7
64549       11ENGSTD        11130             A             2          10           7
64549       11TECHOS        26501             B             2          2            7
64549       11MUSDRS        63212             C             1          1            7
45461       11ECOECO        11110             A             2          13           7
45461       11ENGADV        11140             A             2          13           7
45461       11HISMOD        11270             A             2          13           7
45461       11HISLST        11220             A             2          13           7
45461       11MATMAT        11240             A             2          13           7
45461       11PRS1U         11350             A             1          13           7
45461       11SCIBIO        11030             A             2          13           7

请注意第一个学生,我有一个 A 类科目单元数(总共 11 个)他只做 A 类科目。对于第二个学生,他有 10 个单元的 A 类科目,他正在做 1 个价值 2 个单元的 B 类科目和一个价值 1 个单元的 C 类科目。最后的学生只有 13 个 A 类单元。

现在我真正想要的是这样的东西...!

StudentID   Sum A Units Sum B Units Sum C Units Sum A Units + Sum B Units   Count of Subjects
61687          11           0           0                  11                 7
64549          10           2           1                  12                 7
45461          13           0           0                  13                 7

所以我想要一些聚合函数,将一个学生分组到只有 1 行,并将他的不同单元的总和作为单独的字段。我还想要一个将 A 类和 B 类单元相加的字段,以及一个计算他们正在做的科目总数的字段。如果学生没有完成正确数量的 A 或 B 单元等,我可以使用此数据设置一些警告消息

我玩过常见的 table 表达式、子查询等,但我不确定我在做什么,也不确定以我想要的形式获取数据的正确方法。

有人能帮忙吗?

SELECT
STUDENTID,
SUM(CASE BOARDCATEGORY WHEN 'A' THEN 1 ELSE 0 END) AS SUM_A_UNITS,
SUM(CASE BOARDCATEGORY WHEN 'B' THEN 1 ELSE 0 END) AS SUM_B_UNITS,
SUM(CASE BOARDCATEGORY WHEN 'C' THEN 1 ELSE 0 END) AS SUM_C_UNITS,
SUM(CASE BOARDCATEGORY WHEN 'A' THEN 1 WHEN 'B' THEN 1 ELSE 0 END) AS SUM_A_UNITS+SUM_B_UNITS,
COUNT(BOARDCODE) AS COUNT_OF_SUBJECTS
FROM (
    SELECT StudentID
    ,AssessmentCode
    ,BoardCode
    ,BoardCategory
    ,BoardUnits
    ,sum(cast(boardunits as int)) over (partition by studentid,boardcategory) as UnitCount
    ,Count(boardcategory) over (partition by studentid)  as SubjectCount
    FROM uvNCStudentSubjectDetails
    where fileyear = 2015 
    and filesemester = 1
    and studentyearlevel = 11 
    and StudentIBFlag = 0
    order by Studentnameinternal,BoardCategory
)
GROUP BY STUDENTID;

将您的 SQL 语句包装在解决方案中,以便您可以立即看到解决方案的作用。

使用 SUM 和 CASE(即仅当满足条件时才使用 SUM)。