如果你要做轉(zhuǎn)換查詢,真心勸你不要這么干,我的寫法很麻煩,一張表不停的查詢,邏輯讀肯定搞得要死。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的大觀網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
如果是往下面這張表灌數(shù),那么可以寫循環(huán),慢慢來一行對(duì)應(yīng)一列,可以根據(jù)表的列和數(shù)據(jù)的對(duì)應(yīng)關(guān)系往里面灌,這個(gè)相對(duì)簡(jiǎn)單些。
我的寫法大概是子查詢+union all 上面為a表
那么就寫為select ‘第一季度' 銷售額,(select 第一季度銷售額 from a where 產(chǎn)品名稱='奶酪')奶酪,(select 第一季度銷售額 from a where 產(chǎn)品名稱='啤酒') from dual
union all
還像上面那么寫,寫第二季度
union all
第三季度
union all
第四季度
一張表重讀查詢8次,如果表很大,我估計(jì)機(jī)器會(huì)宕掉的。
因?yàn)閱为?dú)從一列來看也可以理解為列轉(zhuǎn)行,所以用case when寫也可以,這么寫似乎讀取的次數(shù)會(huì)少些,不過要用到group by分組,天知道二者最后誰的消耗大。不過如果表很大的話,還是那句話,建議新建表然后灌數(shù),這么直接查,真的會(huì)死掉的。
以上為個(gè)人建議,如果找到什么好寫法,也可以研究下。
SQL create table t (a number, b varchar2(10));
表已創(chuàng)建。
SQL insert into t values(1,'A');
已創(chuàng)建 1 行。
SQL insert into t values(1,'B');
已創(chuàng)建 1 行。
SQL insert into t values(2,'A');
已創(chuàng)建 1 行。
SQL insert into t values(2,'B');
已創(chuàng)建 1 行。
SQL insert into t values(3,'C');
已創(chuàng)建 1 行。
SQL insert into t values(3,'F');
已創(chuàng)建 1 行。
SQL insert into t values(4,'D');
已創(chuàng)建 1 行。
SQL commit;
提交完成。
SQL select a,max(decode(c,1,b,null)),
2 max(decode(c,2,b,null)),
3 max(decode(c,3,b,null))
4 from(select a,b,row_number()over(partition by a order by b ) c from t)
5* group by a
SQL /
A MAX(DECODE MAX(DECODE MAX(DECODE
---------- ---------- ---------- ----------
1 A B
2 A B
3 C F
4 D
SQL
可以使用wm_concat()函數(shù);
下面是我做的一個(gè)例子,可以參考下,當(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中列傳行可用wm_concat來實(shí)現(xiàn)。
如test表中數(shù)據(jù)如下:
現(xiàn)要將name列一列顯示成行,可用如下語句:
select wm_concat(name) from test;結(jié)果:
基本思路:對(duì)每班學(xué)生排序,根據(jù)序號(hào)構(gòu)造列名,拼接動(dòng)態(tài)sql
--測(cè)試數(shù)據(jù)
create?table
("學(xué)生"?varchar2(10)
,"學(xué)號(hào)"?varchar2(10)
,"班級(jí)"?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
--動(dòng)態(tài)拼接Pivot??
declare
sqlstr?varchar2(8000):='';
begin
--構(gòu)造類似于?'學(xué)號(hào)1','學(xué)號(hào)2',...??的字符串
for?x?in?(?????
select?distinct?row_number()?over?(partition?by?"班級(jí)"?order?by?"學(xué)號(hào)")?seq?
from?"表A"?order?by?seq?)?loop?
sqlstr?:=?sqlstr?||?','''?||?'學(xué)號(hào)'?||to_char(x.seq)||'''';?
end?loop;?
sqlstr:=substr(sqlstr,2,length(sqlstr)-1);
--將前面構(gòu)造的字符串放入Pivot語句中
sqlstr:='
select?*?from?(
select?"學(xué)號(hào)","班級(jí)",?''學(xué)號(hào)''||?to_char(
row_number()?over?(partition?by?"班級(jí)"?order?by?"學(xué)號(hào)"))?seq??
from?"表A")?t
pivot(
max("學(xué)號(hào)")
for?seq?in?('||sqlstr||')??
)';
--dbms_output.put_line(sqlstr);
--將查詢結(jié)果放入臨時(shí)視圖中
sqlstr?:=?'CREATE?OR?REPLACE?VIEW?tmp_result??AS?'||?sqlstr;
--dbms_output.put_line(sqlstr);
execute?immediate?sqlstr;
end;
--查看結(jié)果
select?*?from?tmp_result;
結(jié)果如下: