SQL,第一列并计算其属性

时间:2018-05-25 01:39:21

标签: mysql sql

说我对学生的成绩有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 个答案:

答案 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查询更复杂。