Oracle 行列转换笔记
工作中经常会用到这个场景,但是发现每次都会忘记要怎么做,这里特将Oracle进行行转列进行一个归纳总结;
使用PIVOT进行动态行转列
首先建立一个测试表course:
CREATE TABLE PS_T_LY_TEST_COURSE(
id NUMBER(11) primary key,
name varchar2(30),
tutor_id varchar2(11),
year number(4)
);
插入测试数据:
insert into PS_T_LY_TEST_COURSE VALUES (1,'语文课','10001',2018);
insert into PS_T_LY_TEST_COURSE VALUES (2,'数学课','10002',2018);
insert into PS_T_LY_TEST_COURSE VALUES (3,'化学课','10003',2018);
insert into PS_T_LY_TEST_COURSE VALUES (4,'物理课','10004',2018);
insert into PS_T_LY_TEST_COURSE VALUES (5,'生物课','10003',2018);
insert into PS_T_LY_TEST_COURSE VALUES (6,'体育课','10001',2018);
insert into PS_T_LY_TEST_COURSE VALUES (7,'历史课','10001',2018);
insert into PS_T_LY_TEST_COURSE VALUES (8,'地理课','10002',2018);
insert into PS_T_LY_TEST_COURSE VALUES (9,'社会课','10004',2018);
insert into PS_T_LY_TEST_COURSE VALUES (10,'英语课','10003',2018);
insert into PS_T_LY_TEST_COURSE VALUES (11,'日语课','10003',2018);
insert into PS_T_LY_TEST_COURSE VALUES (12,'德语课','10003',2018);
insert into PS_T_LY_TEST_COURSE VALUES (13,'法语课','10003',2018);
insert into PS_T_LY_TEST_COURSE VALUES (14,'俄语课','10003',2018);
insert into PS_T_LY_TEST_COURSE VALUES (15,'科学课','10002',2018);
insert into PS_T_LY_TEST_COURSE VALUES (16,'哲学课','10002',2018);
insert into PS_T_LY_TEST_COURSE VALUES (17,'法学课','10002',2018);
insert into PS_T_LY_TEST_COURSE VALUES (18,'会计课','10001',2018);
insert into PS_T_LY_TEST_COURSE VALUES (19,'计算机课','10001',2018);
insert into PS_T_LY_TEST_COURSE VALUES (20,'人生课','10001',2018);
insert into PS_T_LY_TEST_COURSE VALUES (21,'语文课+','10001',2019);
insert into PS_T_LY_TEST_COURSE VALUES (22,'数学课+','10002',2019);
insert into PS_T_LY_TEST_COURSE VALUES (23,'化学课+','10003',2019);
insert into PS_T_LY_TEST_COURSE VALUES (24,'物理课+','10004',2019);
insert into PS_T_LY_TEST_COURSE VALUES (25,'生物课+','10003',2019);
insert into PS_T_LY_TEST_COURSE VALUES (26,'体育课+','10001',2019);
insert into PS_T_LY_TEST_COURSE VALUES (27,'历史课+','10001',2019);
insert into PS_T_LY_TEST_COURSE VALUES (28,'地理课+','10002',2019);
insert into PS_T_LY_TEST_COURSE VALUES (29,'社会课+','10004',2019);
insert into PS_T_LY_TEST_COURSE VALUES (30,'英语课+','10003',2019);
insert into PS_T_LY_TEST_COURSE VALUES (31,'日语课+','10003',2019);
insert into PS_T_LY_TEST_COURSE VALUES (32,'德语课+','10003',2019);
insert into PS_T_LY_TEST_COURSE VALUES (33,'法语课+','10003',2019);
insert into PS_T_LY_TEST_COURSE VALUES (34,'俄语课+','10003',2019);
insert into PS_T_LY_TEST_COURSE VALUES (35,'科学课+','10002',2019);
insert into PS_T_LY_TEST_COURSE VALUES (36,'哲学课+','10002',2019);
insert into PS_T_LY_TEST_COURSE VALUES (37,'法学课+','10002',2019);
insert into PS_T_LY_TEST_COURSE VALUES (38,'会计课+','10001',2019);
insert into PS_T_LY_TEST_COURSE VALUES (39,'计算机课+','10001',2019);
insert into PS_T_LY_TEST_COURSE VALUES (40,'人生课+','10001',2019);
统计历年各个导师教授的课程数
SELECT *
FROM (SELECT YEAR, TUTOR_ID FROM PS_T_LY_TEST_COURSE) PIVOT(COUNT(1) FOR TUTOR_ID IN('10001' AS "导师1",
'10002' AS "导师2",
'10003' AS "导师3",
'10004' AS "导师4"));
使用DECODE进行动态行转列
select year,
count(decode(tutor_id, '10001', ID, NULL)) 导师1,
count(decode(tutor_id, '10002', ID, NULL)) 导师2,
count(decode(tutor_id, '10003', ID, NULL)) 导师3,
count(decode(tutor_id, '10004', ID, NULL)) 导师4
FROM PS_T_LY_TEST_COURSE
group by year;
使用CASE WHEN进行动态行转列
select year,
count(CASE tutor_id WHEN '10001' THEN ID ELSE NULL END) 导师1,
count(CASE tutor_id WHEN '10002' THEN ID ELSE NULL END) 导师2,
count(CASE tutor_id WHEN '10003' THEN ID ELSE NULL END) 导师3,
count(CASE tutor_id WHEN '10004' THEN ID ELSE NULL END) 导师4
FROM PS_T_LY_TEST_COURSE
group by year;
好了就介绍以上三种方法,写的很简陋,也没有什么说明,只为自己记录使用;
PS:如需转载请注明出处!