在Oracle 11g中,Oracle 又增加了2個查詢:
pivot(行轉列) 和
unpivot(列轉行)
測試如下:
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);
commit;
--分組查詢
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 * from (select name, nums from demo) pivot (sum(nums) for name in (select distinct name from demo));
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);
XML類型
上述pivot列轉行示例中,你已經知道了需要查詢的類型有哪些,用in()的方式包含,假設如果您不知道都有哪些值,您怎么構建查詢呢?
pivot 操作中的另一個子句 XML 可用于解決此問題。該子句允許您以 XML 格式創建執行了 pivot 操作的輸出,在此輸出中,您可以指定一個特殊的子句 ANY 而非文字值
示例如下:
select * from ( select name, nums as "Purchase Frequency" from demo t) pivot xml ( sum( "Purchase Frequency" ) for name in (any));
使用任何 XML 分析器中的輸出生成更有用的輸出