有一張表
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...