假设有张学生成绩表(CJ)如下 
[姓名] [学科] [成绩] 
张三 语文 80 
张三 数学 86 
张三 英语 75 
李四 语文 78 
李四 数学 85 
李四 英语 78 要显示成如下结果:姓名             语文       数学       英语     总成绩
---------- ---------- ---------- ---------- ----------
李四               78         85         78        241
张三               80         86         75        241
总分              158        171        153       482 
如何实现?我现在弄成这样姓名             语文       数学       英语     总成绩
---------- ---------- ---------- ---------- ----------
李四               78         85         78        241
张三               80         86         75        241对应SQL为:select name as 姓名,sum(case xk when '语文' then chengji end) as 语文,
sum(case xk when '数学' then chengji end) as 数学,
sum(case xk when '英语' then chengji end) as 英语,
sum(chengji) as 总成绩 from cj group by name;不知道要怎么继续下去问,sum(case xk when '语文' then chengji end)这个什么意思,拿张三的记录来说,语文,数学,英语就只有一个成绩,为什么要用sum,我尝试吧sum去掉,就报错了,这句话到底怎么理解?谢谢

解决方案 »

  1.   

    典型的行转列。
    sum(case xk when '语文' then chengji end) as 语文是汇总所有语文成绩(虽然每name只有一条记录)
    sum(chengji)是总成绩,汇总所有科目。
    如果你去掉
    sum(case xk when '语文' then chengji end) as 语文,
    sum(case xk when '数学' then chengji end) as 数学,
    sum(case xk when '英语' then chengji end) as 英语,
    前面的sum,那么group by子句必须使用group by name,case xk when '语文' then chengji end,case xk when '数学' then chengji end,case xk when '英语' then chengji end无法达到你的目的
      

  2.   

    select name as 姓名,sum(case xk when '语文' then chengji end) as 语文,
    sum(case xk when '数学' then chengji end) as 数学,
    sum(case xk when '英语' then chengji end) as 英语,
    sum(chengji) as 总成绩 from cj group by name;
    ----------------------
    你可以将所有的sum都去掉,看一下select出来的中间结果,事实上,这个结果应该类似于下面的方式
    姓名  语文   数学  英语  总成绩
    张三  90    null  null  90
    张三  null   80   null  80
    张三  null   null  85   85
    ok,看到这个结果的话,楼主应该知道为什么要sum了吧
      

  3.   

    sum的目的是要多行聚合成一行
    如果不是数字型,则可能要使用max来聚合
      

  4.   

    你是把 一维表变成二维表  所以通常的办法是用group by  ,所以需要用聚合 sum,
    其实你可以看作有个中间表
    select t.name as 姓名,case when t.xk='语文' then t.chengji else 0 end as 语文,
    case when t.xk='数学' then t.chengji else 0 end as 数学,
    case when t.xk='英语' then t.chengji else 0 end as 英语,
    sum(chengji) as 总成绩 from cj  t