如: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
如
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;
看到這裡,已經有了解決思路了,在oracle中建乙個function,**如下:
create or replace function get_ver(tmp_boinstid varchar2)
return varchar2
isvers varchar2(100);
begin
for cur in (select pln_ver from pms_budget_plan where boinst_id=tmp_boinstid order by is_all_run) loop
vers := vers||cur.pln_ver||',';
end loop;
vers := rtrim(vers,1);
return vers;
end get_ver;
然後使用這個函式來查詢就可以了,
select distinct p.pln_name,p.pln_year,get_ver(boinst_id) from pms_budget_plan p where p.pln_type =20 and p.del_flag = -1 and boinst_id is not null
需要注意的是,由於函式中也使用了sql,所以這個方法不太適合大資料量的查詢,使用時應注意。 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 轉換為 語文 數學 英...