1. 程式人生 > >Oracle 11g使用Pivot函式實現資料聚合行轉列

Oracle 11g使用Pivot函式實現資料聚合行轉列

經常使用資料庫,我們有很大的精力應付在處理各種各樣的資料型別,處理各種型別的報表。需要對資料進行行列轉換,Oracle 11G 提供了pivot函式,方便我們對資料進行行列轉換。

表設計如下:

create table tongji(
id number primary key, 
name varchar2(10),
time date, --日期
temperature number --溫度
)

資料如下:

insert into tongji values(1,'河南',to_date('2015-01-01','yyyy-mm-dd'),10);
insert into tongji values(2,'河南',to_date('2015-02-01','yyyy-mm-dd'),15);
insert into tongji values(3,'四川',to_date('2015-01-01','yyyy-mm-dd'),12);
insert into tongji values(4,'四川',to_date('2015-02-01','yyyy-mm-dd'),14);
insert into tongji values(5,'北京',to_date('2015-01-01','yyyy-mm-dd'),15);
insert into tongji values(6,'北京',to_date('2015-02-01','yyyy-mm-dd'),16);
insert into tongji values(7,'上海',to_date('2015-01-01','yyyy-mm-dd'),15);
insert into tongji values(8,'上海',to_date('2015-02-01','yyyy-mm-dd'),15);
insert into tongji values(9,'山東',to_date('2015-01-01','yyyy-mm-dd'),17);
insert into tongji values(1,'山東',to_date('2015-02-01','yyyy-mm-dd'),17);

select * from tongji

查詢結果為:


如果要查詢每個地市,每月的最高氣溫,查詢語句如下:

select t.name,to_char(t.time,'mm') datetime,max(t.temperature) maxTempt
from tongji t
group by t.name,to_char(t.time,'mm')
order by 1, 2
查詢結果:

可以查出每個地市,月最高氣溫。但是此時資料,每月一行儲存。而我們有時需要資料每行儲存一個地市的且每月佔一列。

這時候我們可以選擇使用Oracle 11G提供的pivot函式,或者使用後臺演算法處理(表格資料反轉)我前面寫過這裡就不在贅述。

這裡介紹pivot,語法:

select *

from t

pivot 

(

   max(value)  --聚合操作函式

   for object_type --行轉列標準

   in ('TABLE','INDEX') --行轉列列取值和順序

)
表t中只含參與聚合、排序、轉換的列。而函式僅需三部分內容 1、 聚合列取值。需要告訴pivot函式進行轉列的過程中,聚合操作的函式和處理物件;

2、行轉列標準。依據那個列進行行轉列;

3、 列轉行取值。因為要將資料行取值轉成列,我們需要告訴Oracle那些取值成列,並且這些取值成列的過程中,列順序是如何的; 查詢語句:
with tj as(
select t.name, to_char(t.time,'mm') datetime,t.temperature from tongji t
)
select *
from tj 
pivot(
max(tj.temperature)
for datetime in ('01','02') 
)

with tj as(
select t.name, to_char(t.time,'mm') datetime,t.temperature from tongji t
)
select *
from tj 
pivot(
max(tj.temperature) as maxvalue
for datetime in ('01' as p01,'02' as p02) 
)



with .. as 語法可自行學習,簡而言之,它的作用就相當於處理資料,製作臨時表。

查詢結果:

對比上下查詢結果,完成所需功能。

當然,這裡僅僅是拋磚引玉,具體更加詳細的功能,還需要聰明的你去發現。

結論

現實工作中會遇到各種奇怪的需求。在選擇工具的時候,應儘可能的選擇類庫、預定義提供的方法函式,不要輕易的選擇自定義方法。因為對現成的類庫和產品來說,它在實現這個方法的時候傾注了很大心血,其效率一定是比我們自己寫的要強。多練習、運用、總結。