Erp100论坛's Archiver

xiangzhao 发表于 2008-7-12 22:54

竖表转横表的SQL语句?

如何用最简单的SQL(最好一句话就可以实现为好)完成如下功能:
假设有表:Score
//=================
pname      bname     score
A                 Chinese           80.0
A                 Math              70.0
A                 EngLish           80.0
B                 Computer          120.0
要求实现功能:
  显示结果为:
pname  bname chinesescore  bname  mathscore  bname  englishscore
A      chinese   80        math    70        english   80

xiangzhao 发表于 2008-7-12 22:54

select pname,bname,decode(bname,'chinese',score) as

chinesescore ,decode(bname,'Math',score) as

Mathscore,decode(bname,'EngLish',score) as

EngLishscore ,decode(bname,'Computer' ,score) as

Computer score from tablename

xiangzhao 发表于 2008-7-12 22:54

先写个函数(作用:把学科和分数并起来)
create or replace function f_get_bname_score(var_a1 in varchar2) return varchar2 is
  v_Result varchar2(32767);
  cursor c_bname is
    select bname,score
      from 表名
     where pname = var_a1;
begin
  for cbname in c_bname loop
    v_Result := v_Result ||cbname.bname||'~'||cbname.score ||'/';
  end loop;
  return(v_Result);
end f_get_bname_score;
查询(反复利用Oracle instr和substr函数):

select pname,
       substr(ChineseScore, 1, instr(ChineseScore, '~') - 1) as bname,
       substr(ChineseScore, instr(ChineseScore, '~') + 1, 20) as ChineseScore,
       substr(EnglishScore, 1, instr(EnglishScore, '~') - 1) as bname,
       substr(EnglishScore, instr(EnglishScore, '~') + 1, 20) as EnglishScore,
       substr(MathScore, 1, instr(MathScore, '~') - 1) as bname,
       substr(MathScore, instr(MathScore, '~') + 1, 20) as MathScore
  from (select pname,
               --rtrim(a, '/'),
               substr(a, 1, instr(a, '/') - 1) as ChineseScore,
               rtrim(substr(a, - (instr(a, '/'))), '/') as EnglishScore,
               --substr(a,instr(a, '/')+1),
               substr(substr(a, instr(a, '/') + 1),
                      1,
                      instr(substr(a, instr(a, '/') + 1), '/') - 1) as MathScore
          from (select distinct pname, f_get_bname_score(pname) as a
                  from test_table))
缺点:
    学科是固定3个的,若多于3个需要修改函数和修改查询语句

xiangzhao 发表于 2008-7-12 22:54

create table test_table
(
pname varchar2(100),
bname varchar2(100),
score varchar2(100)
);

insert into test_table values('A','Chinese','80.0');
insert into test_table values('A','Math','70.0');
insert into test_table values('A','EngLish','80.0');
insert into test_table values('B','Computer','120.0');
commit;


select pname,max(decode(cn,1,bname)) bname,max(decode(cn,1,score)) ChineseScore,
             max(decode(cn,2,bname)) bname,max(decode(cn,2,score)) EnglishScore,
             max(decode(cn,3,bname)) bname,max(decode(cn,3,score)) MathScore
from (select pname,bname,score,row_number() over(partition by pname order by bname) cn from test_table) a
group by pname;

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.