基本思路:對每班學(xué)生排序,根據(jù)序號構(gòu)造列名,拼接動態(tài)sql
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站建設(shè)、網(wǎng)站制作與策劃設(shè)計,浮山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:浮山等地區(qū)。浮山做網(wǎng)站價格咨詢:18982081108
--測試數(shù)據(jù)
create?table
("學(xué)生"?varchar2(10)
,"學(xué)號"?varchar2(10)
,"班級"?varchar2(10)
);?
insert?into?"表A"?
select?'張三','100','一班'?from?dual?union?all
select?'李四','101','二班'?from?dual?union?all
select?'王五','102','一班'?from?dual?union?all
select?'趙六','103','三班'?from?dual?union?all
select?'李二','104','二班'?from?dual
--動態(tài)拼接Pivot??
declare
sqlstr?varchar2(8000):='';
begin
--構(gòu)造類似于?'學(xué)號1','學(xué)號2',...??的字符串
for?x?in?(?????
select?distinct?row_number()?over?(partition?by?"班級"?order?by?"學(xué)號")?seq?
from?"表A"?order?by?seq?)?loop?
sqlstr?:=?sqlstr?||?','''?||?'學(xué)號'?||to_char(x.seq)||'''';?
end?loop;?
sqlstr:=substr(sqlstr,2,length(sqlstr)-1);
--將前面構(gòu)造的字符串放入Pivot語句中
sqlstr:='
select?*?from?(
select?"學(xué)號","班級",?''學(xué)號''||?to_char(
row_number()?over?(partition?by?"班級"?order?by?"學(xué)號"))?seq??
from?"表A")?t
pivot(
max("學(xué)號")
for?seq?in?('||sqlstr||')??
)';
--dbms_output.put_line(sqlstr);
--將查詢結(jié)果放入臨時視圖中
sqlstr?:=?'CREATE?OR?REPLACE?VIEW?tmp_result??AS?'||?sqlstr;
--dbms_output.put_line(sqlstr);
execute?immediate?sqlstr;
end;
--查看結(jié)果
select?*?from?tmp_result;
結(jié)果如下:
可以使用wm_concat()函數(shù);
下面是我做的一個例子,可以參考下,當(dāng)然具體語法可以百度,也可以去官方文檔查:
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
INSERT INTO 新表 (SELECT ID, '呼吸系統(tǒng)疾病' FROM 原表 WHERE 呼吸系統(tǒng)疾病有無 = 1 UNION SELECT ID, '消化系統(tǒng)疾病' FROM 原表 WHERE 消化系統(tǒng)疾病有無 = 1
UNION SELECT ID, '循環(huán)系統(tǒng)疾病' FROM 原表 WHERE 循環(huán)系統(tǒng)疾病有無 = 1)
如果使用行轉(zhuǎn)列,還得使用merge into,還不如上面的語句清晰。
Oracle?11g 行列互換 pivot 和 unpivot 說明在Oracle 11g中,Oracle 又增加了2個查詢:pivot(行轉(zhuǎn)列) 和unpivot(列轉(zhuǎn)行)
參考:、 一下,網(wǎng)上有一篇比較詳細的文檔:
pivot 列轉(zhuǎn)行
測試數(shù)據(jù) (id,類型名稱,銷售數(shù)量),案例:根據(jù)水果的類型查詢出一條數(shù)據(jù)顯示出每種類型的銷售數(shù)量。
?
123456789
create table demo(id int,name varchar(20),nums int);? ---- 創(chuàng)建表insert into demo values(1, '蘋果', 1000);insert into demo values(2, '蘋果', 2000);insert into demo values(3, '蘋果', 4000);insert into demo values(4, '橘子', 5000);insert into demo values(5, '橘子', 3000);insert into demo values(6, '葡萄', 3500);insert into demo values(7, '芒果', 4200);insert into demo values(8, '芒果', 5500);
分組查詢 (當(dāng)然這是不符合查詢一條數(shù)據(jù)的要求的)
?
1
select name, sum(nums) nums from demo group by name
行轉(zhuǎn)列查詢
?
1
select * from (select name, nums from demo) pivot (sum(nums) for name in ('蘋果' 蘋果, '橘子', '葡萄', '芒果'));
注意: pivot(聚合函數(shù) for 列名 in(類型)) ,其中 in(‘’) 中可以指定別名,in中還可以指定子查詢,比如 select distinct code from customers
當(dāng)然也可以不使用pivot函數(shù),等同于下列語句,只是代碼比較長,容易理解
?
12
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 行轉(zhuǎn)列
顧名思義就是將多列轉(zhuǎn)換成1列中去
案例:現(xiàn)在有一個水果表,記錄了4個季度的銷售數(shù)量,現(xiàn)在要將每種水果的每個季度的銷售情況用多行數(shù)據(jù)展示。
創(chuàng)建表和數(shù)據(jù)
?
1234567
create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);?insert into Fruit values(1,'蘋果',1000,2000,3300,5000);insert into Fruit values(2,'橘子',3000,3000,3200,1500);insert into Fruit values(3,'香蕉',2500,3500,2200,2500);insert into Fruit values(4,'葡萄',1500,2500,1200,3500);select * from Fruit
列轉(zhuǎn)行查詢
?
1
select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )
注意: unpivot沒有聚合函數(shù),xiaoshou、jidu字段也是臨時的變量
網(wǎng)站題目:oracle怎么將列轉(zhuǎn)行,行轉(zhuǎn)列oracle方法
文章源于:http://chinadenli.net/article42/heeiec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、做網(wǎng)站、服務(wù)器托管、網(wǎng)站制作、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)