oracle動態交叉表

2021-08-31 10:40:46 字數 1241 閱讀 3478

有一張表

id name quarter quantity

1 開發部 春天 10000

2 開發部 夏天 50000

3 開發部 秋天 30000

4 開發部 冬天 20000

5 銷售部 春天 10000

6 銷售部 夏天 4000

7 銷售部 秋天 30000

8 銷售部 冬天 20000

想要轉換為

quarter 開發部 銷售部

夏天 50000 4000

春天 10000 10000

秋天 30000 30000

冬天 20000 20000

如果已知部門可以寫靜態sql:

select quarter ,sum(decode(name,'開發部',quantity,0)) 開發部,

sum(decode(name,'銷售部',quantity,0)) 銷售部

from department group by quarter

如果部門未知的話,可以寫動態sql,因為oracle中返回結果集過於麻煩,所以可以通過建立臨時表,或者是檢視的方式,間接再查詢結果集,所以我拼裝執行的sql有乙個建立檢視的動作:

declare

cv_sql varchar2(5000):=' ';

cn_number number;

cn_i number :=0;

sql_query varchar2(5000);

begin

for v_cur in (select distinct name into cn_number from department)

loop

cv_sql:= cv_sql||',sum(decode(name,'''|| v_cur.name ||''',quantity,0)) '|| v_cur.name;

end loop;

sql_query:='create or replace view query_zjx_v as select quarter'||cv_sql||' from department group by quarter';

dbms_output.put_line(sql_query);

execute immediate sql_query;

end;

Oracle動態生成查詢交叉表

表結構 序號字段 中文名稱 型別 說 明 1 reportid number 4 報告編號 2 recordno number 記錄號 3 fieldno number 2 字段編號 4 datum varchar 200 值 reportid recordno fieldno datum 1 1 ...

SQL動態交叉表

動態交叉表就是列表可以根據表中資料的情況動態建立列。動態查詢不能使用 select 語句實現,它可以利用儲存過程實現。思路是 首先檢索列頭資訊,形成乙個游標,然後遍歷游標,將上面靜態交叉表實現過程中使用 case 語句判斷的內容用游標裡的值替代,形成一條新的 sql查詢語句,然後執行並返回結果。下面...

動態交叉表總結

declare sql varchar 8000 看論壇裡討論動態交叉表這麼多貼,小結了一下.其實建立動態交叉表裡是應用了遞迴的select變數這種概念,遞迴的select變數可以使用select語句和子查詢將乙個變數與其自身拼接起來。乙個標準的建立動態交叉表的code我歸納如下 declare s...