sql,将一列分组并计算其属性

h9a6wy2h  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(306)

说我有亲戚 grades 关于学生的成绩:

  1. | ID | semester | Year | course_id | grade |
  2. |------+----------+------+-----------+-------+
  3. | 1018 | Fall | 2002 | 272 | A+ |
  4. | 107 | Fall | 2002 | 274 | B |
  5. | 111 | Fall | 2002 | 123 | C |
  6. /* a lot of data here */
  7. |------+----------+------+-----------+-------+------------|

我想分组 course_id 这样计算它的等级:

  1. | course_id | semester | year | A+ | A- | B+ | B- | C+ | D+ | D- | else | sum |
  2. | 1 | Fall | 2009 | 11 | 8 | 10 | 1 | 1 | 1 | 1 | 1 | 34 |
  3. | 2 | Fall | 2009 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 8 |

我已经想出了一个解决办法,但似乎不满足于我:

  1. /* use sum function */
  2. select course_id, semester, year,
  3. sum(if(grade = 'A+', 1, 0)) as 'A+',
  4. sum(if(grade = 'A-', 1, 0)) as 'A-',
  5. /* multiple lines */
  6. from grades
  7. group by course_id, semester, year;

我想知道是否有一个更内置的方法,使它,因为我上面的解决方案是有点棘手,而不是一般性的。
有人能提供更好的主意吗?
p、 s:是的,这是学校的作业,我想寻求更多的解决办法:)如果能给我更多的提示,我将不胜感激。

hmtdttj4

hmtdttj41#

没有“更简单”的方法可以做到这一点。实际上,我会将逻辑(假设mysql)简化为:

  1. select course_id, semester, year,
  2. sum( grade = 'A+') as `A+`,
  3. sum(i grade = 'A-') as `A-`,
  4. /* multiple lines */
  5. from grades
  6. group by course_id, semester, year;

然而,这可能不是你想要的。sql查询返回一组列,并修复它们的名称和类型。如果希望列基于实际值,则不能轻易使用简单的sql语句。
可以使用动态sql,但这比sql查询更复杂。

相关问题