Oracle 行列转换笔记

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:如需转载请注明出处!

猜你喜欢

转载自www.cnblogs.com/shyly5140/p/12106222.html
今日推荐