当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
关于oracle的查询结果的行列互换
发布时间:2010/12/12 20:18:40 来源:城市学习网 编辑:ziteng
  /*
  在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换.
  比如有如下数据:
  ID NAME       KECHENG              CHENGJI
  -- ---------- -------------------- -------
  1  a          语文                 80
  2  a          数学                 70
  3  b          语文                 40
  4  b          数学                 100
  5  c          语文                 90
  6  c          数学                 92
  那末我要求显示的结果是:
  NAME       YUWEN                  SHUXUE
  ---------- ---------------------- ----------------------
  a          80                     70
  也就是说把课程这一列放到行上显示.把成绩按照课程分配到相对应的行.
  我只介绍2中简单易用的方法,使用游标或者建立临时表的方法就不介绍了.效率很慢,不易理解.
  首先建立表:
  */
  create table fzq
  (
  id varchar(2),
  name varchar(10),
  kecheng varchar(20),
  chengji varchar(3)
  );
  --插入数据:
  insert into fzq values ('1','a','语文','80');
  insert into fzq values('2','a','shuxue','70');
  insert into fzq values ('3','b','yuwen','40');
  insert into fzq values ('4','b','shuxu','100');
  insert into fzq values ('5','c','yuwen','90');
  insert into fzq values ('6','c','shuxu','92');
  /*首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.*/
  select name,sum(yuwen) yuwen,sum(shuxue) shuxue from
  (
  select name,chengji yuwen,'0' shuxue from fzq
  where kecheng='yuwen' union
  select name,'0' yuwen,chengji  shuxue
  from fzq
  where kecheng='shuxue'
  ) aaa
  group BY name;
  /*执行结果:
  NAME       YUWEN                  SHUXUE
  ---------- ---------------------- ----------------------
  a          80                     70
  b          40                     100
  c          90                     92
  */
  /*
  其次是用case.这种方法代码比较短.适合列值很多的情况.
  */
  select name, sum(case kecheng when 'yuwen' then chengji end) yuwen,
  sum(case kecheng  when 'shuxue' then chengji  end) shuxue
  from fzq
  group by name;
  /*执行结果:
  NAME       YUWEN                  SHUXUE
  ---------- ---------------------- ----------------------
  a          80                     70
  b          40                     100
  c          90                     92
  所有例子在oracle中测试,sql server没有测试,请根据实际情况修改
  */
  select name,sum(decode(kecheng ,'语文', chengji ,null)) "语文",
  sum(decode(kecheng ,'数学', chengji ,null)) "数学",
  sum(decode(kecheng ,'英语', chengji ,null)) "英语"
  from fzq
  group by name
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved