在Oracle 11g中,Oracle 又增加了2個查詢:
pivot(行轉(zhuǎn)列) 和
unpivot(列轉(zhuǎn)行)
測試如下:
create table demo(id int,name varchar(20),nums int); ---- 創(chuàng)建表
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
行轉(zhuǎn)列查詢
select * from (select name, nums from demo) pivot (sum(nums) for name in ('蘋果' 蘋果, '橘子', '葡萄', '芒果'));
pivot(聚合函數(shù) for 列名 in(類型)) ,其中 in(‘’) 中可以指定別名,in中還可以指定子查詢,比如 上面的例子可以改成:
select * from (select name, nums from demo) pivot (sum(nums) for name in (select distinct name from demo));
unpivot 行轉(zhuǎn)列
顧名思義就是將多列轉(zhuǎn)換成1列中去
案例:現(xiàn)在有一個水果表,記錄了4個季度的銷售數(shù)量,現(xiàn)在要將每種水果的每個季度的銷售情況用多行數(shù)據(jù)展示。
創(chuàng)建表和數(shù)據(jù)
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;
列轉(zhuǎn)行查詢
select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4);
XML類型
上述pivot列轉(zhuǎn)行示例中,你已經(jīng)知道了需要查詢的類型有哪些,用in()的方式包含,假設(shè)如果您不知道都有哪些值,您怎么構(gòu)建查詢呢?
pivot 操作中的另一個子句 XML 可用于解決此問題。該子句允許您以 XML 格式創(chuàng)建執(zhí)行了 pivot 操作的輸出,在此輸出中,您可以指定一個特殊的子句 ANY 而非文字值
示例如下:
select * from ( select name, nums as "Purchase Frequency" from demo t) pivot xml ( sum( "Purchase Frequency" ) for name in (any));
使用任何 XML 分析器中的輸出生成更有用的輸出