-oracle数据库恢复-Raid5数据恢复-RAID0数据恢复oracle 开发区 → Oracle里的交叉表转换!!!


  共有2104人关注过本帖树形打印

主题:Oracle里的交叉表转换!!!

oracle数据恢复-RAID5数据恢复-raid数据恢复
haomafan
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:新手上路 帖子:1 积分:70 威望:0 精华:0 注册:2007-3-9 8:05:05
Oracle里的交叉表转换!!!  发帖心情 Post By:2007-3-9 10:36:46

找不到


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
sosdb
  2楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:超级版主 帖子:809 积分:10386 威望:0 精华:1 注册:2007-1-28 11:50:49
  发帖心情 Post By:2007-3-9 10:39:34

在学生基本信息表中,只建两个字段,学号、姓名,其他的诸如性别、科代码等则略。其中班、教师代码库、考试次数标志(即第几次测验,还是期中、期末考试)等也略,只保留下面数据结构足以能说明交叉表生成的过程。

  各表结构简化如下:


  学生基本信息表:JBXX


  xh char(13) //学号


  xm char(8) //姓名,针对不同情况,可用变长字符。


  科目代码表:KMDM


  no number(3) //科目代号,现可用900多科目可用,若不够,可定义四位。


  mc varchar(20) //科目中文名称。


  成绩表: CJ


  xh char(13) //学号,关联JBXX的XH。


  xq number(2) //学期,指该学生所在校的学期。


  km number(3) //科目代号。


  cj number(3) //该科成绩。


  至此,数据表结构已全部建好,此时的任务是把下面表3的数据进行生成交叉表,表4。
  
  交叉表的生成,在Oracle中可以用SQL语句实现。


  select jbxx.xh,jbxx.xm , (select cj.cj from cj where cj.xh=jbxx.xh and cj.xq=1 and cj.km=1) as km1 , (select cj.cj from cj where cj.xh=jbxx.xh and cj.xq=1 and cj.km=2) as km2 , (select cj.cj from cj where cj.xh=jbxx.xh and cj.xq=1 and cj.km==3) as km3 from jbxx where <班级或专业条件> order by jbxx.xh



www.sosdb.com 专业数据库恢复

oracle数据恢复raid数据恢复

qq:9417901

msn:glkgdj@hotmail.com

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
sosdb
  3楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:超级版主 帖子:809 积分:10386 威望:0 精华:1 注册:2007-1-28 11:50:49
  发帖心情 Post By:2007-3-9 10:39:58

在oracle的test表中插入记录
INSERT INTO test values (N'张三',N'语文',60)

INSERT INTO test values (N'李四',N'数学',70)

INSERT INTO test values (N'王五',N'英语',80)

INSERT INTO test values (N'王五',N'数学',75)

INSERT INTO test values (N'王五',N'语文',57)

INSERT INTO test values (N'李四',N'语文',80)

INSERT INTO test values (N'张三',N'英语',100)
交叉表语句的实现:

--用于:交叉表的列数是确定的

select name,sum(case subject when '数学' then source else 0 end) as '数学',

 sum(case subject when '英语' then source else 0 end) as '英语',

 sum(case subject when '语文' then source else 0 end) as '语文'

from test

group by name
用oracle存储过程实现
CREATE OR REPLACE PACKAGE BODY "TEST1" as

 procedure sp_test(p_cursor out t_cursor)

 is
 sqlstr varchar2(32767);
 begin
 sqlstr:='select name,';
 --构造字符串
 for v_cur in (select distinct subject from test)
 loop
 sqlstr:=sqlstr||'sum(case subject when '''|| v_cur.subject ||''' then score else 0 end ) as '|| v_cur.subject ||',';
 end loop;



 sqlstr := substr(sqlstr,0,length(sqlstr)-1) ||' from test group by name';

 open p_cursor for sqlstr;

 end;
 end;


www.sosdb.com 专业数据库恢复

oracle数据恢复raid数据恢复

qq:9417901

msn:glkgdj@hotmail.com

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
小I机器人
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:新手上路 帖子:14 积分:130 威望:0 精华:0 注册:2007-4-9 15:55:46
  发帖心情 Post By:2007-6-8 15:03:33

"在oracle的test表中插入记录"

这个哪里来的。其实是2个例子。中间有部分错误。

create table JBXX
(
xh char(13) , 
xm char(8)
);

create table KMDM
(
no  number(3) ,
mc varchar(20)
);

create table CJ
(
xh char(13),
xq  number(2),
km  number(3),
cj  number(3)
);


select jbxx.xh,
       jbxx.xm,
       (select cj.cj
          from cj
         where cj.xh = jbxx.xh
           and cj.xq = 1
           and cj.km = 1) as km1,
       (select cj.cj
          from cj
         where cj.xh = jbxx.xh
           and cj.xq = 1
           and cj.km = 2) as km2,
       (select cj.cj
          from cj
         where cj.xh = jbxx.xh
           and cj.xq = 1
           and cj.km = 3) as km3
  from jbxx
 --where < 班级或专业条件 >
 order by jbxx.xh


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

Oracle里的交叉表转换!!!








签名