oracle 行列轉換

2021-08-31 10:41:50 字數 1624 閱讀 4490

[q]如何實現行列轉換

[a]1、固定列數的行列轉換

如student subject grade

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

student1 語文 80

student1 數學 70

student1 英語 60

student2 語文 90

student2 數學 80

student2 英語 100

……轉換為

語文 數學 英語

student1 80 70 60

student2 90 80 100

……語句如下:

select student,sum(decode(subject,'語文', grade,null)) "語文",

sum(decode(subject,'數學', grade,null)) "數學",

sum(decode(subject,'英語', grade,null)) "英語"

from table

group by student

2、不定列行列轉換

如c1 c2

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

1 我1 是

1 誰2 知

2 道3 不

……轉換為

1 我是誰

2 知道

3 不這一型別的轉換必須借助於pl/sql來完成,這裡給乙個例子

create or replace function get_c2(tmp_c1 number)

return varchar2

is col_c2 varchar2(4000);

begin

for cur in (select c2 from t where c1=tmp_c1) loop

col_c2 := col_c2||cur.c2;

end loop;

col_c2 := rtrim(col_c2,1);

return col_c2;

end;

/sql> select distinct c1 ,get_c2(c1) cc2 from table;即可

另,有些也可以有自連線的方法,如:

有一tab表,內容如下

year month

2009  1

2009  2

2010  1

2010  2

要出現如下結果,sql語句該怎麼寫

year m1 m2

2009  1  2

2010  1  2

sql:select distinct  a.year, a.month as 'm1', b.month as 'm2'

from tab a,tab b

where a.year=b.year

and a.month='1'

and b.month='2'

下面的sql有一定的借鑑性,但不符合要求

select distinct a.year year, a.month m1, b.month m2

from tab a, tab b

where a.year = b.year

and a.month <> b.month

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 轉換為 語文 數學 英...