基本思路:对每班学生排序,根据序号构造列名,拼接动态sql
--测试数据
create?table
);?
insert?into?"表A"?
select?'张三','100','一班'?from?dual?union?all
select?'李四','101','二班'?from?dual?union?all
--动态拼接Pivot?
declare
begin
for?x?in?(??
select?distinct?row_number()?over?(partition?by?"班级"?order?by?"学号")?seq?
from?"表A"?order?by?seq?)?loop?
sqlstr?:=?sqlstr?||?','''?||?'学号'?||to_char(x.seq)||'''';?
end?loop;?
--将前面构造的字符串放入Pivot语句中
sqlstr:='
select?*?from?(
select?"学号","班级",?''学号''||?to_char(
row_number()?over?(partition?by?"班级"?order?by?"学号"))?seq?
from?"表A")?t
pivot(
max("学号")
for?seq?in?('||sqlstr||')?
)';
--dbms_output.put_line(sqlstr);
--将查询结果放入临时视图中
sqlstr?:=?'CREATE?OR?REPLACE?VIEW?tmp_result?AS?'||?sqlstr;
execute?immediate?sqlstr;
end;
--查看结果
select?*?from?tmp_result;
结果如下:
可以使用wm_concat()函数;
下面是我做的一个例子,可以参考下,当然具体语法可以百度,也可以去官方文档查:
SCOTT@ ysdb1show user
USER is "SCOTT"
Table created.
SCOTT@ ysdb1insert into test_concat values(1,'a');
①. row created.
SCOTT@ ysdb1insert into test_concat values(1,'b');
SCOTT@ ysdb1insert into test_concat values(1,'c');
SCOTT@ ysdb1select * from test_concat;
ID NAME
---------- ----------
①. a
①. b
①. c
SCOTT@ ysdb1select wm_concat(name) from test_concat;
WM_CONCAT(NAME)
--------------------------------------------------------------------------------
a,b,c,q,w,e,f
SCOTT@ ysdb1select id,wm_concat(name) from test_concat group by id;
ID WM_CONCAT(NAME)
---------- --------------------------------------------------------------------------------
①. a,c,b
INSERT INTO 新表 (SELECT ID, '呼吸系统疾病' FROM 原表 WHERE 呼吸系统疾病有无 = 1 UNION SELECT ID, '消化系统疾病' FROM 原表 WHERE 消化系统疾病有无 = 1
UNION SELECT ID, '循环系统疾病' FROM 原表 WHERE 循环系统疾病有无 = 1)
如果使用行转列,还得使用merge into,还不如上面的语句清晰.
参考:、 一下,网上有一篇比较详细的文档:
pivot 列转行
测试数据 (id,类型名称,销售数量),案例:根据水果的类型查询出一条数据显示出每种类型的销售数量.
分组查询 (当然这是不符合查询一条数据的要求的)
select name, sum(nums) nums from demo group by name
行转列查询
select * from (select name, nums from demo) pivot (sum(nums) for name in ('苹果' 苹果, '橘子', '葡萄', '芒果'));
注意: pivot(聚合函数 for 列名 in(类型)) ,其中 in('') 中可以指定别名,in中还可以指定子查询,比如 select distinct code from customers
当然也可以不使用pivot函数,等同于下列语句,只是代码比较长,容易理解
select * from (select sum(nums) 苹果 from demo where name='苹果'),(select sum(nums) 橘子 from demo where name='橘子'),??(select sum(nums) 葡萄 from demo where name='葡萄'),(select sum(nums) 芒果 from demo where name='芒果');
unpivot 行转列
顾名思义就是将多列转换成1列中去
创建表和数据
列转行查询
注意: unpivot没有聚合函数,xiaoshou、jidu字段也是临时的变量
以上就是土嘎嘎小编为大家整理的oracle怎么将列转行相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!