SQL语句对数据表的行列互换:
原型数据:
         
姓名 语文 数学 英语
张三 85 90 95
李四 80 83 86
转换成:
  
课程 张三 李四
语文 85 80
数学 90 83
英语 95 865
请用sql写出来?建表语句如下:
CREATE TABLE SC
(
  姓名  VARCHAR2(10 BYTE)  NOT NULL,
  语文  VARCHAR2(10 BYTE),
  数学  VARCHAR2(10 BYTE),
  英语  VARCHAR2(10 BYTE)
)
ALTER TABLE SC ADD (
  CONSTRAINT SC_PK
 PRIMARY KEY
 (姓名));
 
INSERT INTO SC  VALUES('张三','85','90','95');
INSERT INTO SC  VALUES('李四','80','83','86');commit;那如何进行互换呢?(不是以下说的这种情况哦)

解决方案 »

  1.   

    不是如下这种情况,请看好。
    /*
    在实际使用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没有测试,请根据实际情况修改
    */