
正文
oracle怎么转换行列 oracle 行转列 pivot
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Oracle 表格行列转换,高手请进
第二种效率高oracle怎么转换行列,首先筛选条件少oracle怎么转换行列,二不做汇总时数据量也明显比第一种oracle怎么转换行列的少,三不用自连接
相关问答
Q1: oracle中怎么将列转换为行
可以使用wm_concat()函数;
下面是我做的一个例子,可以参考下,当然具体语法可以百度,也可以去官方文档查:
SCOTT@ ysdb1show user
USER is "SCOTT"
SCOTT@ ysdb1create table test_concat(id number(5),name varchar2(10));
Table created.
SCOTT@ ysdb1insert into test_concat values(1,'a');
1 row created.
SCOTT@ ysdb1insert into test_concat values(1,'b');
1 row created.
SCOTT@ ysdb1insert into test_concat values(1,'c');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'q');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'w');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'e');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'f');
1 row created.
SCOTT@ ysdb1select * from test_concat;
ID NAME
---------- ----------
1 a
1 b
1 c
2 q
2 w
2 e
2 f
7 rows selected.
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)
---------- --------------------------------------------------------------------------------
1 a,c,b
2 q,f,e,w
Q2: 关于oracle的查询结果的行列互换
/*
在实际使用sql工作中总会碰到将某一列的值放到标题中显示 就是总说的行列转换或者互换
比如有如下数据:
ID NAME KECHENG CHENGJI
a 语文
a 数学
b 语文
b 数学
c 语文
c 数学
那末我要求显示的结果是:
NAME YUWEN SHUXUE
a
也就是说把课程这一列放到行上显示 把成绩按照课程分配到相对应的行
我只介绍 中简单易用的方法 使用游标或者建立临时表的方法就不介绍了 效率很慢 不易理解
首先建立表:
*/
create table fzq
(
id varchar( )
name varchar( )
kecheng varchar( )
chengji varchar( )
);
插入数据:
insert into fzq values ( a 语文 );
insert into fzq values( a shuxue );
insert into fzq values ( b yuwen );
insert into fzq values ( b shuxu );
insert into fzq values ( c yuwen );
insert into fzq values ( c shuxu );
/*首先使用union 如果课程这列有多个值 那么脚本的代码就很长了 */
select name sum(yuwen) yuwen sum(shuxue) shuxue from
(
select name chengji yuwen shuxue from fzq
where kecheng= yuwen union
select name yuwen chengji shuxue
from fzq
where kecheng= shuxue
) aaa
group BY name;
/*执行结果:
NAME YUWEN SHUXUE
a
b
c
*/
/*
其次是用case 这种方法代码比较短 适合列值很多的情况
*/
select name sum(case kecheng when yuwen then chengji end) yuwen
sum(case kecheng when shuxue then chengji end) shuxue
from fzq
group by name;
/*执行结果:
NAME YUWEN SHUXUE
a
b
c
所有例子在oracle中测试 sql server没有测试 请根据实际情况修改
*/
select name sum(decode(kecheng 语文 chengji null)) 语文
sum(decode(kecheng 数学 chengji null)) 数学
sum(decode(kecheng 英语 chengji null)) 英语
from fzq
lishixinzhi/Article/program/Oracle/201311/18036
Q3: 怎样将oracle中的列变成行
固定列数的行列转换如
student subject grade
---------------------------
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
转换为
语文 数学 英语
student1 80 70 60
student2 90 80 100
语句如下:
select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student
2、不定列行列转换如
c1 c2
--------------
1 我
1 是
1 谁
2 知
2 道
3 不
......
转换为
1 我是谁
2 知道
3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
--用于返回值
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
Q4: oracle的行列转换,怎么实现?
--行转列的3种方法,参考
--http: / / blog.sina.com.cn/s/blog_475839a50100s2q3.html
--1. UNION ALL
--适用范围oracle怎么转换行列:8i,9i,10g及以后版本
with tmp as(
select 123 as a, 456 as b, 789 as c from dual)
SELECT a 新列名 FROM tmp
UNION ALL
SELECT b FROM tmp
UNION ALL
SELECT c FROM tmp
--若空行不需要转换oracle怎么转换行列,只需加一个where条件oracle怎么转换行列,
--WHERE COLUMN IS NOT NULL 即可。
--2. MODEL
--适用范围:10g及以后
with tmp as(
select 123 as a, 456 as b, 789 as c from dual)
SELECT v 新列名 FROM tmp
MODEL
RETURN UPDATED ROWS
DIMENSION BY (0 AS n)
MEASURES ('xx' AS cn,'yyy' AS v,a,b,c)
RULES UPSERT ALL(
v[1] = a[0],
v[2] = b[0],
v[3] = c[0]
)
--3. COLLECTION
--适用范围:8i,9i,10g及以后版本
--要创建一个对象和一个集合:
CREATE OR REPLACE TYPE v_type AS OBJECT(v VARCHAR2(100));
CREATE OR REPLACE TYPE v_varr AS VARRAY(8) OF v_type;
with tmp as(
select 123 as a, 456 as b, 789 as c from dual)
SELECT t.v AS 新列名
FROM tmp,
TABLE(v_varr(v_type(tmp.a),v_type(tmp.b),v_type(tmp.c))) t;
Q5: oracle数据列转成行
Oracle行转换为列是比较常见,网上常见的例子如下:
grades表:
student subject grade
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 10
转换为
语文 数学 英语
Student1 80 70 60
Student2 90 80 100
执行语句如下:
Select student,
sum(decode(subject,'语文',grade,null)) "语文",
sum(decode(subject,'数学',grade,null)) "数学",
sum(decode(subject,'英语',grade,null)) "英语"
from grades
group by student order by student;
Select student,sum(decode(subject,'语文',grade,null)) "语文",sum(decode(subject,'数学',grade,null)) "数学",sum(decode(subject,'英语',grade,null)) "英语"from gradesgroup by student order by student;
下面,介绍列转换为行的操作:
假设一个表test,记录如下:
表头id proc1 proc2 proc3
记录12 3.4 6.7 12.4
想变成如下格式:
表头 id proc value
记录 12 proc1 3.4
记录 12 proc2 6.7
记录 12 proc3 12.4
方法一:采用union all方法(这种方法会随着字段的增多,变得很长,不推荐)
select id,'proc1',proc1
from testjac where id=12
union all
select id,'proc2',proc2
from testjac where id=12
union all
select id,'proc3',proc3
from testjac where id=12;
select id,'proc1',proc1 from testjac where id=12 union all select id,'proc2',proc2 from testjac where id=12 union all select id,'proc3',proc3from testjac where id=12;
方法二:采用decode+系统视图USER_TAB_COLS(推荐):
select A.id,B.column_name,decode(B.column_name,'PROC1',A.proc1,'PROC2',A.proc2,'PROC3',A.proc3,null) value
from test A,(select column_name from user_tab_cols where column_id1 and table_name='TEST') B
oracle怎么转换行列的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle 行转列 pivot、oracle怎么转换行列的信息别忘了在本站进行查找喔。







