说我对学生的成绩有grades
这样的关系:
| ID | semester | Year | course_id | grade |
|------+----------+------+-----------+-------+
| 1018 | Fall | 2002 | 272 | A+ |
| 107 | Fall | 2002 | 274 | B |
| 111 | Fall | 2002 | 123 | C |
/* a lot of data here */
|------+----------+------+-----------+-------+------------|
我想按course_id
分组并按照这样计算其成绩:
| course_id | semester | year | A+ | A- | B+ | B- | C+ | D+ | D- | else | sum |
| 1 | Fall | 2009 | 11 | 8 | 10 | 1 | 1 | 1 | 1 | 1 | 34 |
| 2 | Fall | 2009 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 8 |
我已经找到了一个解决方案,但似乎对我不满意:
/* use sum function */
select course_id, semester, year,
sum(if(grade = 'A+', 1, 0)) as 'A+',
sum(if(grade = 'A-', 1, 0)) as 'A-',
/* multiple lines */
from grades
group by course_id, semester, year;
我想知道是否有更强的内置方式来制作它,因为我的上述解决方案有点棘手而且不一般。
任何人都可以提供更好的主意吗?
p.s:是的,这是一项学校作业,我想寻求更多的解决方案:) 如果给我更多提示,将不胜感激。
答案 0 :(得分:2)
没有“简单”的方法来做到这一点。好吧,实际上,我会将逻辑(假设MySQL)简化为:
select course_id, semester, year,
sum( grade = 'A+') as `A+`,
sum(i grade = 'A-') as `A-`,
/* multiple lines */
from grades
group by course_id, semester, year;
然而,这可能不是你想要的。 SQL查询返回修复的一组列,其名称和类型已修复。如果您希望列基于实际值,那么您就不能轻易使用简单的SQL语句。
你可以使用动态SQL,但这比你的SQL查询更复杂。