Oracle_sql 基础_查询练习

来源:互联网 发布:淘宝店banner尺寸 编辑:程序博客网 时间:2024/05/16 11:46
1.行转列:
(1) 单表行转列
    ① 前置条件:
create table tb(姓名 varchar(10),课程 varchar(10),分数 int)insert into tb values('张三','语文',74);insert into tb values('张三','数学',83);insert into tb values('张三','物理',93);insert into tb values('李四','语文',74);insert into tb values('李四','数学',84);insert into tb values('李四','物理',94);select * from tb;
    ② 方法1:
select 姓名, max(case 课程 when '语文' then 分数 else 0 end)语文, max(case 课程 when '数学'then 分数 else 0 end)数学, max(case 课程 when '物理'then 分数 else 0 end)物理from tbgroup by 姓名
    ③ 方法2:
--仅在Oracle11g及以后有用select * from tb pivot(max(分数) for 课程 in (语文,数学,物理))a
    ④ 方法3(显示格式稍微有一些不一样):
SELECT 姓名, WMSYS.WM_CONCAT(课程), WMSYS.WM_CONCAT(分数) FROM tb GROUP BY 姓名;

(2) 多表行转列

------------------------------------------------------------------------------------------------

      ① 前置条件:
create table pm_ci(ci_id varchar(10),stu_ids varchar(10));insert into  pm_ci values('1','1');insert into pm_ci values('1','2');insert into pm_ci values('1','3');insert into pm_ci values('1','4');insert  into  pm_ci values('2','1');insert into  pm_ci values('2','4');select *from pm_ci;SELECT ci_id, WMSYS.WM_CONCAT(stu_ids) FROM pm_ci GROUP BY ci_id;create table pm_stu(stu_id varchar(10),stu_name varchar(10));insert into  pm_stu values('1','张三');insert into pm_stu values('2','李四');insert into pm_stu values('3','王五');insert into pm_stu values('4','赵六');select * from pm_stu;
      ② 提示:
        【1】需要进行两个表的连接查询,为两个表都取别名。
        【2】使用instr(a,b)函数,该函数的含义为:如果字符串b在字符串a的里面,则返回的是b在a中的位置,即返回值大于0。
        【3】需要用到分组查询。
        【4】使用wm_concat(cols)函数对学生姓名用逗号进行拼接。
select c.ci_id, WMSYS.WM_CONCAT(s.stu_name)from pm_ci c, pm_stu swhere instr(c.stu_ids,s.stu_id) > 0group by c.ci_id;


原创粉丝点击