表:T1
字段:TID,YEAR表:T2
字段:TID,MONTH,TYPE
说明:TID,MONTH为1-12,TYPE为A或B数据如下:
TID MONTH TYPE
1    3    A
1    6    B
1   10    A
2    2    A
2    7    B
2    9    A希望按照YEAR输出结果如下:
TID  JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
 1            A           B               A
 2        A                   B       A

解决方案 »

  1.   

    显示的有问题,实际上是TYPE值对应到相应的月份下
      

  2.   

    SELECT tid,decode(month,1,TYPE,null) as "一月",
    decode(month,2,TYPE,null) as "2月",
    decode(month,3,TYPE,null) as "3月",
    decode(month,4,TYPE,null) as "4月",
    decode(month,5,TYPE,null) as "5月",
    decode(month,6,TYPE,null) as "6月",
    decode(month,7,TYPE,null) as "7月",
    decode(month,8,TYPE,null) as "8月",
    decode(month,9,TYPE,null) as "9月",
    decode(month,10,TYPE,null) as "10月",
    decode(month,11,TYPE,null) as "11",
    decode(month,12,TYPE,null) as "12月"
    from t2
      

  3.   

    在实际的应用中,我们经常遇到需要转换数据显示方式,比如将横表转为竖表,或将竖
    表转换为横表的情况,如:课程表的显示方式,部门平均工资的排名等情况。下面将将根据
    两个实例子的需求描述给出两种常见的竖表转横表的解决办法(本例中的数据意思是:一、
    二、三年级的各科目最高分统计)。 表结构: create table test_table 

    grade_id number(8), --年级:1、一年级,2、二年级,3、三年级 
    subject_name varchar2(30), --科目:包含语文、数学、外语、政治等科目 
    max_score number(8) --最高分 

    表中数据: SQL> select * from test_table;  GRADE_ID SUBJECT_NAME MAX_SCORE  1 语文 95 
    1 数学 98  2 语文 86  2 数学 90  2 政治 87  3 语文 93  3 数学 88  3 英语 88  3 政治 97 9 rows selected.  第一种转换方式: 需求描述:查看每个年级在系统中存在的科目信息,并各年级的科目信息按下面的格式
    显示: GRADE_ID SUBJECT_NAME  1 语文 数学  2 语文 数学 政治  3 语文 数学 英语 政治 分析:在要求得到的结果中,每个年级的科目将变成一条记录,而且每个年级的科目是
    不固定的。所以考虑写个函数来解决,输入年级信息,使用游标得到该年级的所有科目信息
    并返回值。 1、建函数: SQL> create or replace function test_fun(p_grade number) return varchar2 as  2 v_temp varchar2(100):='';  3 v_out varchar2(500):='';  4 cursor c is select a.subject_name from test_table a where 
    a.grade_id=p_grade;  5 begin  6 open c ; --打开游标  7 loop  8 fetch c into v_temp;  9 exit when c%notfound; 
    10 v_out:=v_out||' '||v_temp;  11 end loop;  12 close c; --关闭游标  13 return v_out;  14 exception  15 when others then  16 return 'An error occured';  17 end ;  18 / Function created.  SQL> create or replace function test_fun(p_grade number) return varchar2 as  2 v_out varchar2(500):='';  3 cursor c is select a.subject_name from test_table a where 
    a.grade_id=p_grade;  4 begin  5 for v_temp in c loop  6 v_out:=v_out||' '||v_temp.subject_name;  7 end loop; --系统自动关闭游标  8 return v_out;  9 exception  10 when others then  11 return 'An error occured';  12 end ;  13 / Function created.  2、调用函数得到输入结果: SQL> select distinct a.grade_id,test_fun(a.grade_id) subject from test_table a;  GRADE_ID SUBJECT 
    语文 数学 语文 数学 政治 语文 数学 英语 政治  第二种转换方式: 需求描述:要求将表中的年级、科目及最高的信息按照下表的格式显示,如果该年级没开
    的课程,则其最高分用0表示: 年级 语文 数学 英语 政治 一年级 95 98 0 0 二年级 86 90 0 87 三年级 93 88 88 97  分析:该需求将年级的分数及科目信息由纵向转为横向,这样就要针对每个年级的,对
    其科目进行判断,存在科目则显示科目的最高分,如果不存在显示0。这时候就考虑到使用
    decode函数来解决。实现如下:  select 
    decode(t.grade_id,1,'一年级',2,'二年级',3,'三年级') 年级, 
    sum(decode(t.subject_name,’语文’,t.max_score,0)) 语文, 
    sum(decode(t.subject_name,'数学',t.max_score,0)) 数学, 
    sum(decode(t.subject_name,'英语',t.max_score,0)) 英语, 
    sum(decode(t.subject_name,'政治',t.max_score,0)) 政治 
    from 
    test_table t 
    group by 
    t.grade_id
      

  4.   

    一楼出来的结果是:
    TID  JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
     1            A                          
     1                           B       
     1                                      A
     2        A                          
     2                       B               
     2                                  A我已经搞定了,呵呵,多谢各位的指点和提示