Oracle行列轉換

2021-08-17 07:43:18 字數 3134 閱讀 2962

注意:在oracle12上建立錯誤報錯,

create user c##user identified by oracle;

建立使用者的時候使用者名稱以c##或者c##開頭即可

公共使用者名稱必須用c##或c##開頭,本地使用者名,不能以c##,c##開頭,使用者和角色不能同名

注意:12c和11g的使用者名稱是不一樣的,若從oracle11g匯出的表到oracle12c匯入會報錯

在oracle 11g中,oracle 又增加了2個查詢:pivot(行轉列) 和unpivot(列轉行)

pivot 列轉行

測試資料 (id,型別名稱,銷售數量),案例:根據水果的型別查詢出一條資料顯示出每種型別的銷售數量。

create

table demo(id int,name varchar(20),nums int);

---- 建立表

insert

into demo values(1, '蘋果', 1000);

insert

into demo values(2, '蘋果', 2000);

insert

into demo values(3, '蘋果', 4000);

insert

into demo values(4, '橘子', 5000);

insert

into demo values(5, '橘子', 3000);

insert

into demo values(6, '葡萄', 3500);

insert

into demo values(7, '芒果', 4200);

insert

into demo values(8, '芒果', 5500);

分組查詢 (當然這是不符合查詢一條資料的要求的)

行轉列查詢

select * from (select name, nums from demo) 

pivot (sum(nums) for name in ('蘋果' 蘋果, '橘子', '葡萄', '芒果'));

注意: pivot(聚合函式 for 列名 in(型別)) ,其中 in(」) 中可以指定別名,in中還可以指定子查詢,比如 select distinct code from customers

當然也可以不使用pivot函式,等同於下列語句,只是**比較長,容易理解

select *

from (select

sum(nums) 蘋果 from demo where name = '蘋果'),

(select

sum(nums) 橘子 from demo where name = '橘子'),

(select

sum(nums) 葡萄 from demo where name = '葡萄'),

(select

sum(nums) 芒果 from demo where name = '芒果');

unpivot 行轉列顧名思義就是將多列轉換成1列中去

案例:現在有乙個水果表,記錄了4個季度的銷售數量,現在要將每種水果的每個季度的銷售情況用多行資料展示。

建立表和資料

create

table fruit(id int,name varchar(20), q1 int, q2 int,

q3 int, q4 int);

insert

into fruit values(1,'蘋果',1000,2000,3300,5000);

insert

into fruit values(2,'橘子',3000,3000,3200,1500);

insert

into fruit values(3,'香蕉',2500,3500,2200,2500);

insert

into fruit values(4,'葡萄',1500,2500,1200,3500);

列轉行查詢unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )

注意: unpivot沒有聚合函式,xiaoshou、jidu欄位也是臨時的變數

同樣不使用unpivot也可以實現同樣的效果,只是sql語句會很長,而且執行速度效率也沒有前者高

id=f.id)

xiaoshou from fruit f

union

select id, name ,'q2' jidu, (select q2 from fruit where

id=f.id)

xiaoshou from fruit f

union

select id, name ,'q3' jidu, (select q3 from fruit where

id=f.id)

xiaoshou from fruit f

union

select id, name ,'q4' jidu, (select q4 from fruit where

id=f.id)

xiaoshou from fruit f

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