/*
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了西陵免費建站歡迎大家使用!
在實際使用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
可用union all來實現(xiàn)。
如test表中數(shù)據(jù)如下:
現(xiàn)要將id為3的一條按列顯示,可用如下語句:
select?to_char(id)?str?from?test?where?id=3
union?all
select?name?from?test?where?id=3;
查詢結(jié)果:
樓主這種 典型的行列轉(zhuǎn)換問題。
Oracle 一般就通過 DECODE 或者 CASE WHEN 來處理。
SQL CREATE TABLE TEST_YLX (
2 name VARCHAR2(2),
3 zfname VARCHAR2(6),
4 tdate DATE
5 );
Table created.
SQL
SQL INSERT INTO TEST_YLX VALUES ('A', 'size1', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );
1 row created.
SQL INSERT INTO TEST_YLX VALUES ('A', 'size2', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );
1 row created.
SQL INSERT INTO TEST_YLX VALUES ('B', 'size1', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );
1 row created.
SQL INSERT INTO TEST_YLX VALUES ('C', 'size3', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );
1 row created.
SQL
SQL SELECT
2 name,
3 SUM ( DECODE(zfname, 'size1', 1, 0) ) AS size1,
4 SUM ( DECODE(zfname, 'size2', 1, 0) ) AS size2,
5 SUM ( CASE WHEN(zfname = 'size3') THEN 1
6 ELSE 0
7 END
8 ) AS size3
9 FROM
10 test_ylx
11 GROUP BY
12 name;
NAME SIZE1 SIZE2 SIZE3
---- ---------- ---------- ----------
A 1 1 0
B 1 0 0
C 0 0 1
SQL
上面的例子中, size1 和 size2 是用 DECODE
size3 用 CASE WHEN
看具體情況需要,而使用。
========================================
唯一麻煩的是
這個SQL, 需要預(yù)先知道, size1 size2 size3 這些信息
如果表中新增加了 size4 , 需要修改 SQL 語句。