Oracle 11g使用Pivot函式實現資料聚合行轉列
阿新 • • 發佈:2019-02-05
經常使用資料庫,我們有很大的精力應付在處理各種各樣的資料型別,處理各種型別的報表。需要對資料進行行列轉換,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 語法可自行學習,簡而言之,它的作用就相當於處理資料,製作臨時表。
查詢結果:
對比上下查詢結果,完成所需功能。
當然,這裡僅僅是拋磚引玉,具體更加詳細的功能,還需要聰明的你去發現。
結論
現實工作中,會遇到各種奇怪的需求。在選擇工具的時候,應儘可能的選擇類庫、預定義提供的方法函式,不要輕易的選擇自定義方法。因為對現成的類庫和產品來說,它在實現這個方法的時候傾注了很大心血,其效率一定是比我們自己寫的要強。多練習、運用、總結。