oracle横纵表相互转换

/*纵表转横表*/   
CREATE GLOBAL TEMPORARY TABLE test2
(
      uname VARCHAR2(10),
      subject VARCHAR2(10),
      score NUMBER
);


INSERT INTO test2 VALUES('王五','语文',80);
INSERT INTO test2 VALUES('李四','语文',90);
INSERT INTO test2 VALUES('李四','数学',80);
INSERT INTO test2 VALUES('李四','英语',70);
INSERT INTO test2 VALUES('张三','语文',80);
INSERT INTO test2 VALUES('张三','数学',80);
INSERT INTO test2 VALUES('张三','英语',90);

SELECT * FROM test2;



SELECT
        t.uname AS 姓名, 
        SUM(CASE t.subject WHEN '语文' THEN t.score END)AS 语文,
        SUM(CASE t.subject WHEN '数学' THEN t.score END)AS 数学,
        SUM(CASE t.subject WHEN '英语' THEN t.score END)AS 英语      
FROM test2 t
     GROUP BY t.uname;



/*横表转纵表 */ 

CREATE GLOBAL TEMPORARY TABLE test4
(
      uname VARCHAR2(10),
      chinese NUMBER,
      math NUMBER,
      english NUMBER
);

INSERT INTO test4 VALUES('张三',80,90,70);
INSERT INTO test4 VALUES('李四',90,85,95);
INSERT INTO test4 VALUES('王五',88,75,90);


SELECT * FROM test4;



SELECT * FROM (
       SELECT  t.uname,'chinese' AS subject,t.chinese AS score FROM test4 t
       UNION ALL
       SELECT  t.uname,'math' AS subject,t.math AS score FROM test4 t
       UNION ALL
       SELECT  t.uname,'english' AS subject,t.english AS score FROM test4 t
       UNION ALL
       SELECT t.uname,'平均分' AS subject,CAST((t.chinese+t.math+t.english)*1.0/3 AS DECIMAL(18,2)) AS score FROM test4 t
        UNION ALL
       SELECT t.uname,'总分' AS subject,(t.chinese+t.math+t.english) AS score FROM test4 t
)tb
ORDER BY uname,
case tb.subject
   when 'chinese' then 1 
   when 'math' then 2 
   when 'english' then 3 
   when '平均分' then 4
   when '总分' then 5
END   

添加上计算总分和平均分

SQL语句最后加上case相当于排序。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值