说我有亲戚 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:是的,这是学校的作业,我想寻求更多的解决办法:)如果能给我更多的提示,我将不胜感激。
1条答案
按热度按时间hmtdttj41#
没有“更简单”的方法可以做到这一点。实际上,我会将逻辑(假设mysql)简化为:
然而,这可能不是你想要的。sql查询返回一组列,并修复它们的名称和类型。如果希望列基于实际值,则不能轻易使用简单的sql语句。
可以使用动态sql,但这比sql查询更复杂。