1 DLG060913  钢材 13
2 DLG060913  铬矿 15
3 DLG060913  硼砂 1
4 DLG060913  矿石 165
5 DLG060913  矿石 55
6 DLG060913  矿石 220 改变后:  钢材  铬矿 硼砂 矿石
DLG060913 13 15 1 165
DLG060913 55
DLG060913 220各位大侠请帮助解决!

解决方案 »

  1.   

    在实际的应用中,我们经常遇到需要转换数据显示方式,比如将横表转为竖表,或将竖
    表转换为横表的情况,如:课程表的显示方式,部门平均工资的排名等情况。下面将将根据
    两个实例子的需求描述给出两种常见的竖表转横表的解决办法(本例中的数据意思是:一、
    二、三年级的各科目最高分统计)。 表结构: 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.  需求描述:要求将表中的年级、科目及最高的信息按照下表的格式显示,如果该年级没开
    的课程,则其最高分用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 
      

  2.   

    一般我们分两次检索,第一次找到最后有多少列,第二次根据上次的结果,动态生成SQL再次检索,最后才出结果。