oracle 常用寫法 行列互換

2021-08-19 19:58:30 字數 1619 閱讀 8011

oracle 11g 行列互換 pivot 和 unpivot 說明

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

參考: 

google 一下,網上有一篇比較詳細的文件:

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 name, sum(nums) nums from demo group by name

行轉列查詢

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

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

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);

select * from fruit

列轉行查詢

select id , name, jidu, xiaoshou from fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )

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

Oracle行列互換總結

oracle行列互換總結 1.多行換成一行 col1 col2 col1 col2 a 1 a 2 轉換後 a 1,2,3 a 3 a.sys connect by path 函式 select name,ltrim max sys connect by path userid,userid fro...

Oracle筆記 之 行列互換

pivot函式 行轉列函式 格式pivot 任一聚合函式 for 需專列的值所在列名 in 需轉為列名的值 pivot函式位於from集合後 示例示例1 select from emp pivot sum nvl sal,0 for deptno in 10 as accounting,20as r...

SQL(行列互換)

有乙個sql題在面試中出現的概率極高,最近有學生出去面試仍然會遇到這樣的題目,在這裡跟大家分享一下。題目 資料庫中有一張如下所示的表,表名為sales。年 季度銷售量 1991111 1991212 1991313 1991414 1992121 1992222 1992323 1992424 要求...