激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - 從Oracle 表格行列轉置說起

從Oracle 表格行列轉置說起

2019-11-07 16:38Oracle教程網 Oracle

當你面對如下格式的一個表格:NO為人員的ID,MONEY是收入,DAY是星期(1代表星期一,7代表周日)。

NO

MONEY

DAY

1

23

1

1

43

2

1

-45

3

2

42

1

2

-10

2

2

50

3

3

100

8

 

為了符合閱讀習慣,最終報表希望是如下格式:

 

 

 

 

 

NO

MON

TUE

THR

1

23

43

-45

2

42

-10

50

3

 

 

 

 

------------------------

咱們一步步來實現:

1.運用DECODE轉換行為列

SQL:

SELECT NO,
    DECODE(DAY,1,MONEY,'') DAY1,
    DECODE(DAY,2,MONEY,'') DAY2,
    DECODE(DAY,3,MONEY,'') DAY3
FROM TEMP

結果:

 

 

 

NO

DAY1

DAY2

DAY3

1

23

 

 

1

 

43

 

1

 

 

-45

2

42

 

 

2

 

-10

 

2

 

 

50

3

 

 

 

 

2.按NO字段分組,并更改列名

SQL:

SELECT NO, MAX(DAY1) MON, MAX(DAY2) TUE, MAX(DAY3) THR
 FROM (SELECT NO,
        DECODE(DAY, 1, MONEY,'') DAY1,
        DECODE(DAY, 2, MONEY,'') DAY2,
        DECODE(DAY, 3, MONEY,'') DAY3
     FROM TEMP)
 GROUP BY NO;

結果:

 

 

 

 

 

NO

MON

TUE

THR

1

23

43

-45

2

42

-10

50

3

 

 

 

 

------------------------

重難點歸納:

1.DECODE缺省值設置

DECODE語法如下:decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)

如果缺省值由''(兩個單引號)改為0,即SQL:

SELECT NO, MAX(DAY1) MON, MAX(DAY2) TUE, MAX(DAY3) THR
 FROM (SELECT NO,
        DECODE(DAY, 1, MONEY,0) DAY1,
        DECODE(DAY, 2, MONEY,0) DAY2,
        DECODE(DAY, 3, MONEY,0) DAY3
     FROM TEMP)
 GROUP BY NO;

結果如下(所有值為負與空值都被賦為0):

 

 

 

 

 

NO

MON

TUE

THR

1

23

43

0

2

42

0

50

3

0

0

0

 

2.列缺省值設置(DAY值為8的顯示為'undefined')

SQL:

SELECT NO,MONEY,
    DECODE(DAY,1,'MON',2,'TUE',3,'THR','undefined') DAY
FROM TEMP

結果:

 

 

 

 

NO

MONEY

DAY

1

23

MON

1

43

TUE

1

-45

THR

2

42

MON

2

-10

TUE

2

50

THR

3

100

undefined

 

3.行列轉化在表單內數據量較大的情況下消耗較大

原因:

1.掃描目標數據時間開銷大。

2.GROUP BY時,數據冗余帶來的多行合并。

優點:

表結構穩定:DAY增加新值只需增加記錄,無需新增新列!

下一頁 decode()函數使用技巧 

decode()函數使用技巧 
·軟件環境: 
1、Windows NT4.0+ORACLE 8.0.4 
2、ORACLE安裝路徑為:C:\ORANT 
·含義解釋: 
decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值) 

該函數的含義如下: 
IF 條件=值1 THEN 
    RETURN(翻譯值1) 
ELSIF 條件=值2 THEN 
    RETURN(翻譯值2) 
    ...... 
ELSIF 條件=值n THEN 
    RETURN(翻譯值n) 

ELSE 
    RETURN(缺省值) 
END IF 
· 使用方法: 
1、比較大小 
select decode(sign(變量1-變量2),-1,變量1,變量2) from dual; --取較小值 
sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1 

例如: 
變量1=10,變量2=20 
則sign(變量1-變量2)返回-1,decode解碼結果為“變量1”,達到了取較小值的目的。 


2、表、視圖結構轉化 
現有一個商品銷售表sale,表結構為: 
month    char(6)      --月份 
sell    number(10,2)   --月銷售金額 

現有數據為: 
200001  1000 
200002  1100 
200003  1200 
200004  1300 
200005  1400 
200006  1500 
200007  1600 
200101  1100 
200202  1200 
200301  1300 

想要轉化為以下結構的數據: 
year   char(4)      --年份 
month1  number(10,2)   --1月銷售金額 
month2  number(10,2)   --2月銷售金額 
month3  number(10,2)   --3月銷售金額 
month4  number(10,2)   --4月銷售金額 
month5  number(10,2)   --5月銷售金額 
month6  number(10,2)   --6月銷售金額 
month7  number(10,2)   --7月銷售金額 
month8  number(10,2)   --8月銷售金額 
month9  number(10,2)   --9月銷售金額 
month10  number(10,2)   --10月銷售金額 
month11  number(10,2)   --11月銷售金額 
month12  number(10,2)   --12月銷售金額 

結構轉化的SQL語句為: 
create or replace view 
v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12) 
as 
    select 
    substrb(month,1,4), 
    sum(decode(substrb(month,5,2),'01',sell,0)), 
    sum(decode(substrb(month,5,2),'02',sell,0)), 
    sum(decode(substrb(month,5,2),'03',sell,0)), 
    sum(decode(substrb(month,5,2),'04',sell,0)), 
    sum(decode(substrb(month,5,2),'05',sell,0)), 
    sum(decode(substrb(month,5,2),'06',sell,0)), 
    sum(decode(substrb(month,5,2),'07',sell,0)), 
    sum(decode(substrb(month,5,2),'08',sell,0)), 
    sum(decode(substrb(month,5,2),'09',sell,0)), 
    sum(decode(substrb(month,5,2),'10',sell,0)), 
    sum(decode(substrb(month,5,2),'11',sell,0)), 
    sum(decode(substrb(month,5,2),'12',sell,0)) 
    from sale 
    group by substrb(month,1,4);

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成年人精品视频 | 欧美淫视频 | 轻点插视频 | 国产小视频一区 | 4p一女两男做爰在线观看 | 国产三级在线视频观看 | 激情小说激情图片激情电影 | 亚洲一级片在线观看 | 欧美一级黄 | 美女很黄很黄免费的 | 色婷婷久久久亚洲一区二区三区 | 性片久久 | 嫩呦国产一区二区三区av | 免费午夜视频在线观看 | 成人超碰| 中文字幕在线观看91 | 成年性羞羞视频免费观看无限 | 成人区一区二区三区 | 亚洲成人第一区 | 欧美日韩后 | 成人一级毛片 | 久久99精品久久久久久青青日本 | 日本黄免费 | 亚洲电影免费观看高清完整版在线观 | 国产精品99久久久久久大便 | 全免费午夜一级毛片真人 | 日韩在线欧美在线 | 欧美激情精品久久久久久黑人 | 久久亚洲国产精品 | 久久影院午夜 | 亚洲精品wwww | 日本在线观看视频网站 | 136福利视频 | 国产免费一区 | 一区播放| 亚洲导航深夜福利涩涩屋 | 成片免费观看大全 | 国产一级91| 国产91av视频 | 国产精品午夜未成人免费观看 | 福利在线国产 |