oracle怎么行變列 oracle中行轉(zhuǎn)列

oracle如何實現(xiàn)行轉(zhuǎn)列

用union all

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),東營企業(yè)網(wǎng)站建設(shè),東營品牌網(wǎng)站建設(shè),網(wǎng)站定制,東營網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,東營網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

假設(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 ...

關(guān)于oracle的查詢結(jié)果的行列互換

/*

在實際使用sql工作中總會碰到將某一列的值放到標題中顯示 就是總說的行列轉(zhuǎn)換或者互換

比如有如下數(shù)據(jù):

ID NAME?????? KECHENG????????????? CHENGJI

a????????? 語文????????????????

a????????? 數(shù)學(xué)????????????????

b????????? 語文????????????????

b????????? 數(shù)學(xué)????????????????

c????????? 語文????????????????

c????????? 數(shù)學(xué)????????????????

那末我要求顯示的結(jié)果是:

NAME?????? YUWEN????????????????? SHUXUE

a????????? ????????????????????

也就是說把課程這一列放到行上顯示 把成績按照課程分配到相對應(yīng)的行

我只介紹 中簡單易用的方法 使用游標或者建立臨時表的方法就不介紹了 效率很慢 不易理解

首先建立表:

*/

create table fzq

(

id varchar( )

name varchar( )

kecheng varchar( )

chengji varchar( )

);

插入數(shù)據(jù):

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;

/*執(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中測試 sql server沒有測試 請根據(jù)實際情況修改

*/

select name sum(decode(kecheng 語文 chengji null)) 語文

sum(decode(kecheng 數(shù)學(xué) chengji null)) 數(shù)學(xué)

sum(decode(kecheng 英語 chengji null)) 英語

from fzq

lishixinzhi/Article/program/Oracle/201311/18036

oracle 行轉(zhuǎn)換為列

如果你要做轉(zhuǎn)換查詢,真心勸你不要這么干,我的寫法很麻煩,一張表不停的查詢,邏輯讀肯定搞得要死。

如果是往下面這張表灌數(shù),那么可以寫循環(huán),慢慢來一行對應(yīng)一列,可以根據(jù)表的列和數(shù)據(jù)的對應(yīng)關(guā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次,如果表很大,我估計機器會宕掉的。

因為單獨從一列來看也可以理解為列轉(zhuǎn)行,所以用case

when寫也可以,這么寫似乎讀取的次數(shù)會少些,不過要用到group

by分組,天知道二者最后誰的消耗大。不過如果表很大的話,還是那句話,建議新建表然后灌數(shù),這么直接查,真的會死掉的。

以上為個人建議,如果找到什么好寫法,也可以研究下。

當(dāng)前文章:oracle怎么行變列 oracle中行轉(zhuǎn)列
轉(zhuǎn)載源于:http://www.muchs.cn/article18/hhehgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、動態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、全網(wǎng)營銷推廣、移動網(wǎng)站建設(shè)

廣告

聲明:本網(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)

微信小程序開發(fā)