如果你要做轉(zhuǎn)換查詢,真心勸你不要這么干,我的寫法很麻煩,一張表不停的查詢,邏輯讀肯定搞得要死。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到錦江網(wǎng)站設(shè)計(jì)與錦江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋錦江地區(qū)。
如果是往下面這張表灌數(shù),那么可以寫循環(huán),慢慢來(lái)一行對(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ú)從一列來(lái)看也可以理解為列轉(zhuǎn)行,所以用case when寫也可以,這么寫似乎讀取的次數(shù)會(huì)少些,不過(guò)要用到group by分組,天知道二者最后誰(shuí)的消耗大。不過(guò)如果表很大的話,還是那句話,建議新建表然后灌數(shù),這么直接查,真的會(huì)死掉的。
以上為個(gè)人建議,如果找到什么好寫法,也可以研究下。
固定列數(shù)的行列轉(zhuǎn)換如
student subject grade
---------------------------
student1 語(yǔ)文 80
student1 數(shù)學(xué) 70
student1 英語(yǔ) 60
student2 語(yǔ)文 90
student2 數(shù)學(xué) 80
student2 英語(yǔ) 100
轉(zhuǎn)換為
語(yǔ)文 數(shù)學(xué) 英語(yǔ)
student1 80 70 60
student2 90 80 100
語(yǔ)句如下:
select student,sum(decode(subject,'語(yǔ)文', grade,null)) "語(yǔ)文",
sum(decode(subject,'數(shù)學(xué)', grade,null)) "數(shù)學(xué)",
sum(decode(subject,'英語(yǔ)', grade,null)) "英語(yǔ)"
from table
group by student
2、不定列行列轉(zhuǎn)換如
c1 c2
--------------
1 我
1 是
1 誰(shuí)
2 知
2 道
3 不
......
轉(zhuǎn)換為
1 我是誰(shuí)
2 知道
3 不
這一類型的轉(zhuǎn)換必須借助于PL/SQL來(lái)完成,這里給一個(gè)例子
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;
方法一:最好理解
select?t.指標(biāo)名
,sum(decode(t.工廠,'一廠',t.指標(biāo)值,0))?一廠
,sum(decode(t.工廠,'二廠',t.指標(biāo)值,0))?二廠
from?數(shù)據(jù)表?t
group?by?t.指標(biāo)名
方法二:用oracle11g新特性Pivot,也很好理解
select?指標(biāo)名,"一廠","二廠"
from?數(shù)據(jù)表?t
pivot?(sum(t.指標(biāo)值)?for?"工廠"?in?('一廠'?as?"一廠",'二廠'?as?"二廠"))
只限于例子中數(shù)據(jù)。
select?sum(y),sum(z)?from
?(select?1?x,decode(a,1,a)?y,decode(a,2,a)?z?from?t?union
? select?2?x,decode(b,11,b)?y,decode(b,22,b)?y?from?t?union
? select?3?x,decode(c,111,c)?y,decode(c,333,c)?z?from?t)
group?by?x;