oracle下可以用函數(shù)decode處理:
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)清河門,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
select 產(chǎn)品名稱,
sum(decode(季度,'第一季度',銷售額,0)) 第一季度銷售額,
sum(decode(季度,'第二季度',銷售額,0)) 第二季度銷售額,
sum(decode(季度,'第三季度',銷售額,0)) 第三季度銷售額,
sum(decode(季度,'第四季度',銷售額,0)) 第四季度銷售額,
from 表名
group by 產(chǎn)品名稱;
姓名 數(shù)學(xué) 語(yǔ)文 姓名 張飛 趙云 龐統(tǒng)
張飛 60 61 數(shù)學(xué) 60 80 99
趙云 80 85 變成 語(yǔ)文 61 85 80
龐統(tǒng) 99 80
而且第一行為列名,不是表中的數(shù)據(jù),這樣的話
也就是第一個(gè)表下面三行的數(shù)據(jù),變成第二個(gè)表下面兩行的數(shù)據(jù)
這樣還是可以的
如果你要做轉(zhuǎn)換查詢,真心勸你不要這么干,我的寫法很麻煩,一張表不停的查詢,邏輯讀肯定搞得要死。
如果是往下面這張表灌數(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è)人建議,如果找到什么好寫法,也可以研究下。
用union all
假設(shè)列名分別為 col1 cola colb...
select col1,cola
from tabname
where ...
union all
select col1,colb
from tabname
where ...
union all
select col1,colc
from tabname
where ...
union all
select col1,cold
from tabname
where ...
union all
select col1,cole
from tabname
where ...
union all
select col1,colf
from tabname
where ...
/*
在實(shí)際使用sql工作中總會(huì)碰到將某一列的值放到標(biāo)題中顯示 就是總說(shuō)的行列轉(zhuǎn)換或者互換
比如有如下數(shù)據(jù):
ID NAME?????? KECHENG????????????? CHENGJI
a????????? 語(yǔ)文????????????????
a????????? 數(shù)學(xué)????????????????
b????????? 語(yǔ)文????????????????
b????????? 數(shù)學(xué)????????????????
c????????? 語(yǔ)文????????????????
c????????? 數(shù)學(xué)????????????????
那末我要求顯示的結(jié)果是:
NAME?????? YUWEN????????????????? SHUXUE
a????????? ????????????????????
也就是說(shuō)把課程這一列放到行上顯示 把成績(jī)按照課程分配到相對(duì)應(yīng)的行
我只介紹 中簡(jiǎn)單易用的方法 使用游標(biāo)或者建立臨時(shí)表的方法就不介紹了 效率很慢 不易理解
首先建立表:
*/
create table fzq
(
id varchar( )
name varchar( )
kecheng varchar( )
chengji varchar( )
);
插入數(shù)據(jù):
insert into fzq values ( a 語(yǔ)文 );
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 如果課程這列有多個(gè)值 那么腳本的代碼就很長(zhǎng)了 */
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;
/*執(zhí)行結(jié)果:
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;
/*執(zhí)行結(jié)果:
NAME?????? YUWEN????????????????? SHUXUE
a????????? ????????????????????
b????????? ????????????????????
c????????? ????????????????????
所有例子在oracle中測(cè)試 sql server沒(méi)有測(cè)試 請(qǐng)根據(jù)實(shí)際情況修改
*/
select name sum(decode(kecheng 語(yǔ)文 chengji null)) 語(yǔ)文
sum(decode(kecheng 數(shù)學(xué) chengji null)) 數(shù)學(xué)
sum(decode(kecheng 英語(yǔ) chengji null)) 英語(yǔ)
from fzq
lishixinzhi/Article/program/Oracle/201311/18036