Oracle 行列转换(二) case行列转换小例

版权声明:本文为原创文章,转载请标明出处。 https://blog.csdn.net/zwjzqqb/article/details/81737263

简单说明:

有一张考勤表,表中包含三个字段,分别是日期、课程名和上课的学生姓名
这是一张较为简单的流水表,本例将简单探寻我们能够实现的查询功能

查询功能梳理:

1° 准备测试数据:

create table attend
  (dt varchar2(10),
   cn varchar2(10),
   sn varchar2(10));
--dt时间,cn课程名,sn学生名
insert into attend values('Mo','SQL','A');
insert into attend values('Mo','SQL','B');
insert into attend values('Mo','SQL','C');
insert into attend values('Mo','SHELL','A');
insert into attend values('Mo','SHELL','C');
insert into attend values('Tu','SQL','B');
insert into attend values('Tu','SQL','C');
insert into attend values('Tu','SHELL','A');
insert into attend values('Tu','SHELL','B');
insert into attend values('Tu','SHELL','C');
commit;

2° 简单分组查询,每天每门课程的上课人数:

select dt, cn, count(SN) from attend group by dt, cn;

3° 行列转换,将同一天不同课程的上课人数在同一行进行展示:

select dt,
       count(decode(cn, 'SQL', sn)) as sql,
       count(decode(cn, 'SHELL', sn)) as shell
  from attend
 group by dt;
-- 该SQL的推演步骤:根据需求选取冗余数据列日期,展开课程列列值,展开成学生姓名列的相应列值
-- 冗余数据列分组,展开列聚合

4° 表的三列数据都有重复冗余,因此能有多个行列转换功能:

select decode(dt,'Mo','周一','Tu','周二') as 日期,
       count(decode(cn, 'SQL', sn)) as "SQL课程上课人数",
       count(decode(cn, 'SHELL', sn)) as "SHELL课程上课人数"
  from attend
 group by dt;

select decode(dt,'Mo','周一','Tu','周二') as 日期,
       count(decode(sn, 'A', cn)) as "学生A上课次数",
       count(decode(sn, 'B', cn)) as "学生B上课次数",
       count(decode(sn, 'C', cn)) as "学生C上课次数"
  from attend
 group by dt;

select cn as "课程名",
       count(decode(dt, 'Mo', sn)) as "周1上课人数",
       count(decode(dt, 'Tu', sn)) as "周2上课人数"
  from attend
 group by cn;

select cn as "课程名",
       count(decode(sn, 'A', dt)) as "学生A本周上课次数",
       count(decode(sn, 'B', dt)) as "学生B本周上课次数",
       count(decode(sn, 'C', dt)) as "学生C本周上课次数"
  from attend
 group by cn;

select sn as "学生姓名",
       count(decode(dt, 'Mo', cn)) as "周一上课次数",
       count(decode(dt, 'Tu', cn)) as "周二上课次数"
  from attend
 group by sn;

select sn as "学生姓名",
       count(decode(cn, 'SQL', cn)) as "SQL课程出席次数",
       count(decode(cn, 'SHELL', cn)) as "SHELL课程出席次数"
  from attend
 group by sn;

5° 简单总结:

该例子比较贴合一般的行列转换需求,依据冗余数据列,将第二列的列值展开成第三列或者其他表达式
第二列的列值就变成了展开列的列名,然后依据冗余数据列分组,聚合展开列
选取冗余列——>其他列展开——>聚合展开列

[TOC]

猜你喜欢

转载自blog.csdn.net/zwjzqqb/article/details/81737263
今日推荐