首页 > 解决方案 > 如何在不写选择的情况下分组

问题描述

我试图在 oracle 中编写一个 sql 脚本,该脚本对来自不同列的数据进行分组。

让我们看看下面的例子:

class_name 年份 student_id 年级 考试 ID
--------- ---- --------- ----- --------
2012 年 3 90 1
2012 年 4 80 1
A 2012 5 70 1
2013 年 3 90 1
A 2013 4 100 2
2013 年 5 70 1
2014 年 3 90 1
2014 年 4 100 2
2014 年 5 75 3
2015 年 3 85 4
2015 年 4 95 4
2015 年 5 80 4
2016 年 3 85 4
2016 年 4 90 5
2016 年 5 90 5

上表显示了一个名为“A”的班级,该班级有 3 名学生以及每年特定考试的成绩。每年都有一次新的考试,如果学生决定参加考试,则表格将填满新的考试 ID,否则(即学生没有参加考试)表格将再次填满旧的考试-id(和旧等级)

现在,我想显示每年实际参加考试的学生人数。

所以结果应该是这样的:

class_name 年份 num_of_students_take_the_exam
--------- ---- -----------------
2012 年 3
2013 年 1
2014 年 1
2015 年 3
2016 年 2

我知道如何使用 select 和 group-by 以及 select 和 group-by 结果。但这似乎太复杂了。

选择类名、年份、计数(年份)
从
  (选择
     class_name, min(year) as year, student_id, Grade, min(exam-id)
   从
     我的表
   在哪里
     类名 = 'A'
   通过...分组
     class_name、student_id、等级)
通过...分组
  类名,年份

有没有返回相同结果的简单 sql 脚本?

谢谢

标签: sqloraclegroup-by

解决方案


您当前的查询可以简化一点,但您不能删除嵌套聚合:

select class_name, year, count(*)
from
  (select 
     class_name, min(year) as year, student_id, exam_id
   from 
     my_table
   Where 
     class_name = 'A'
   group by
     class_name, student_id, exam_id) -- don't group by grade, there might be two different exams with the same grade
group by
  class_name, year

用 LAG(或 ROW_NUMBER)重写可能不是更简单/更有效


推荐阅读