Oracle行列轉換

2022-08-23 09:24:15 字數 4186 閱讀 7177

行列轉換

在使用者製作資料包表時,經常會使用到表資料的行列轉換操作!

這裡我們建立兩個表,插入資料,用於實現下面的行列轉換操作。

表也建好了,資料也插入完成了,接下來就可以進行行列轉換操作啦!!!

行轉列方法一:使用case when實現

select

t.y,

max(case

when t.q =

1then

t.amt

else

0end

) q1,

max(case

when t.q =

2then

t.amt

else

0end

) q2,

max(case

when t.q =

3then

t.amt

else

0end

) q3,

max(case

when t.q =

4then

t.amt

else

0end

) q4

from

t_row t

group

by t.y

方法二:使用decode實現

select

t.y,

sum(decode(t.q, 1, t.amt, 0

)) q1,

sum(decode(t.q, 2, t.amt, 0

)) q2,

sum(decode(t.q, 3, t.amt, 0

)) q3,

sum(decode(t.q, 4, t.amt, 0

)) q4

from

t_row t

group

by t.y;

方法三:使用位移函式的上移函式(lead函式)實現

with tmp_row as

(select

t.y,

t.q,

t.amt,

lead(t.amt,

1) over(partition by t.y order

byt.q) lead1,

lead(t.amt,

2) over(partition by t.y order

byt.q) lead2,

lead(t.amt,

3) over(partition by t.y order

byt.q) lead3

from

t_row t)

select

y, amt q1,

lead1 q2,

lead2 q3,

lead3 q4

from

tmp_row

where q =

1;

方法四:使用位移函式的下移函式(lag函式)實現

with tmp_row as

(select

t.y,

t.q,

t.amt,

lag(t.amt,

1) over(partition by t.y order

by t.q desc

) lag1,

lag(t.amt,

2) over(partition by t.y order

by t.q desc

) lag2,

lag(t.amt,

3) over(partition by t.y order

by t.q desc

) lag3

from

t_row t)

select

y, amt q1,

lag1 q2,

lag2 q3,

lag3 q4

from

tmp_row

where q =

1;

方法五:使用oracle獨有的函式pivot實現

select

*from

t_row

pivot(

sum(amt) for q in (1 q1,2 q2,3 q3,4 q4));

列轉行方法一:使用oracle獨有的函式unpivot實現

select

y,q,amt

from (select y,q1,q2,q3,q4 from

t_column)

unpivot(amt

for q in (q1 as

1,q2 as

2,q3 as

3,q4 as

4));

方法二:使用union all實現

with tmp_column as

(select t.y, 1

q, t.q1 amt

from

t_column t

union

allselect t.y, 2

q, t.q2 amt

from

t_column t

union

allselect t.y, 3

q, t.q3 amt

from

t_column t

union

allselect t.y, 4

q, t.q4 amt

from

t_column t)

select

y, q,

amt

from

tmp_column

order

by y, q;

Oracle行列轉換

1.列轉行 create table t col row id int,c1 varchar2 10 c2 varchar2 10 c3 varchar2 10 insert into t col row values 1,v11 v21 v31 insert into t col row valu...

Oracle行列轉換

行轉列 select count over cnt,rn,str from select rownum rn,substr a.str,instr a.str,1,a.n 1,instr a.str,1,a.n 1 instr a.str,1,a.n 1 str from select a,b,c,...

oracle 行列轉換

q 如何實現行列轉換 a 1 固定列數的行列轉換 如student subject grade student1 語文 80 student1 數學 70 student1 英語 60 student2 語文 90 student2 數學 80 student2 英語 100 轉換為 語文 數學 英...