横竖表相互转换SQL

以Oracle数据库为例,测试在数据处理中经常遇到数据库中横表和竖表的相互转换,采用学生各科成绩分数为测试数据

横表转换竖表:

CREATE table score
(
   username varchar(10) ,
   chinese  int ,
   math     int ,
   physics  int
);
 
INSERT into score(username , chinese , math , physics) values('Kay',74,83,93);
INSERT into score(username , chinese , math , physics) values('Jim',75,84,94);
INSERT into score(username , chinese , math , physics) values('Lily',86,49,91);
 
COMMIT;
 
SELECT * FROM score;

横表转换成竖表关键在于如何把一条记录转换成多条记录,三个分数字段对应三条记录,可以采用一个只有三条记录中间表和score表做笛卡尔积把一条记录copy成三条记录

WITH T AS
( SELECT 'chinese' course FROM dual
  UNION ALL
  SELECT 'math'    course FROM dual
  UNION ALL 
  SELECT 'physics' course FROM dual
) 
SELECT username,course,decode(course,'chinese',chinese,'math',math,'physics',physics) 
  FROM score ,T  ORDER BY username ,course;

竖表转换横表:

SELECT * FROM course;

竖表转换横表关键在于如何把多条记录合并成一条记录,按照username进行group by 使用聚合函数把多条合并成一条且按不同的类别值合并到不同的字段

SELECT username, 
       MAX(decode(course,'chinese',score)) chinese,
       MAX(decode(course,'math',score)) math,
       MAX(decode(course,'physics',score)) physics
  FROM course
GROUP BY username
ORDER BY username



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值