求助一句sql写法。12楼问题更新

  • o
    opensesame

    谢谢先。

    左侧的表,通过sql,生成右侧的表

    左侧每个学号有多门考试的成绩,每门考试也有多次,就是说1001,可能有几次语文成绩,几次数学成绩,

    生成的右侧表,学号列唯一,累计所有各个学课总分,以及最后一列所有学课总分,如果只要求一个学课,可以用sum,多个学课在一句sql里,不知道sum要怎么写了
  • o
    opensesame
    insert into table_right
    (学号,语文总分,数学总分,英语总分,历史总分,考试总分) "
    select 学号,sum(科目)=======>这里只能得到考试总分,一个个科目怎么分开sum呢
    from table_left
  • o
    oclock
    pivot
  • o
    opensesame
    谢谢,不知道还有这个函数,研究一下
    本来的思路是想sum后面加一个筛选,但是查下来没有这种写法
  • J
    Johnny_zhu
    select 学号,
    sum(case when 科目='语文' then 成绩 else 0 end) as [语文总分],
    sum(case when 科目='英文' then 成绩 else 0 end) as [英文总分],
    sum(case when 科目='数学' then 成绩 else 0 end) as [数学总分],
    sum(成绩) as [总分]
    from table1 group by 学号
  • p
    pepsing
    看楼上吧
  • o
    opensesame
    谢谢谢谢,基本解决,只是还有两个字段比较特殊
    实际上,另外有个表,设置了分类的上下级关系,比如文科里分了语文,英语,理科分了数学,物理

    所有还有两个列,文科总分,理科总分
    这里科目的ID是不固定的,所以还要left join 科目分类表
    这两个字段搞不定了
  • J
    Johnny_zhu
    很简单啊 ,和上面一样用法,比如 left join table2 on table1.科目 = table2.科目 , 理科总分可以这样写 sum(case when table2.总科目='理科' then table1.学分 else 0 end) as [理科总分]
  • o
    opensesame
    非常感谢,学习了
  • q
    qinghe1987
    回复7#opensesame

    做完细分类,sum文理科即可
  • o
    opensesame
    总算搞定,这个函数太神奇了,感谢楼上all
  • o
    opensesame
    之前的问题解决了,更新一下新问题,如果不同的学科在各自一个单独的表里,而且有的学号却语文,有的少数学,就是每个表里的学号行数不一致,怎么合并成一楼这样统计呢。HiPDA·NG
  • p
    ptcptr
    既然之前的问题能解决,现在只是成绩分开到单独的表里了,那么参见5楼写法,把最后的
    from table1 group by 学号
    中的 table1 改成
    (select 科目='语文',学号,成绩 from 语文成绩表 union all
    select 科目='数学',学号,成绩 from 数学成绩表 union all
    select 科目='英语',学号,成绩 from 英语成绩表 union all
    select 科目='历史',学号,成绩 from 历史成绩表) as table1