GBase新聞
數(shù)據(jù)重塑的藝術(shù) | 南大通用GBase 8s數(shù)據(jù)庫(kù)Pivot函數(shù)
作為一款企業(yè)級(jí)的數(shù)據(jù)庫(kù)產(chǎn)品,南大通用GBase 8s數(shù)據(jù)庫(kù)具備杰出的數(shù)據(jù)處理能力。日常數(shù)據(jù)處理中,無(wú)論是報(bào)表制作還是數(shù)據(jù)分析,我們經(jīng)常會(huì)遇到將行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)的需求。Pivot函數(shù)的存在完美解決這一問(wèn)題,輕松實(shí)現(xiàn)行數(shù)據(jù)到列數(shù)據(jù)的轉(zhuǎn)換,幫助我們從不同的角度審視數(shù)據(jù)。本文將詳細(xì)介紹如何使用Pivot函數(shù)進(jìn)行動(dòng)態(tài)行轉(zhuǎn)列操作,并提供具體的操作示例。
GBase 8s Pivot函數(shù)的概述
Pivot,即行轉(zhuǎn)列,是一種將表中的行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)的過(guò)程。通過(guò)Pivot操作,我們可以將數(shù)據(jù)表中的一列或多列的數(shù)據(jù)轉(zhuǎn)化為多列的形式,以便更好地進(jìn)行橫向統(tǒng)計(jì)和分析。
Unpivot,即列轉(zhuǎn)行,與Pivot相反,Unpivot則是將表中的列數(shù)據(jù)轉(zhuǎn)換為行數(shù)據(jù)。以便更好地進(jìn)行縱向統(tǒng)計(jì)和分析。
Pivot和Unpivot是數(shù)據(jù)轉(zhuǎn)換中非常有用的兩個(gè)函數(shù),它們可以根據(jù)需要改變數(shù)據(jù)的呈現(xiàn)方式,使得數(shù)據(jù)更易于理解和分析。在數(shù)據(jù)庫(kù)查詢(xún)、數(shù)據(jù)分析、報(bào)表制作等領(lǐng)域中,都有著廣泛的應(yīng)用。我們將在下一篇文章介紹Unpivot函數(shù)。
GBase 8s pivot的語(yǔ)法詳解
Pivot 轉(zhuǎn)換數(shù)據(jù)的過(guò)程:多行被聚合,然后轉(zhuǎn)換成列,每一列表示聚合數(shù)據(jù)的不同范圍。語(yǔ)法如下:
pivot緊跟from,位于from和where之間。
【一句話(huà)來(lái)說(shuō)明】:pivot(聚合函數(shù)1 as 別名1,聚合函數(shù)2 as 別名2 ...) for 需要轉(zhuǎn)為列的字段1,字段2.... in((字段1值1,字段2值1) as 別名1,(字段1值2,字段2值2) as 別名2...)
GBase 8s Pivot示例
注意:以下所用示例使用的數(shù)據(jù)庫(kù)版為:GBase8sV8.8_TL_3.5.1_x86_64
下面示例都是對(duì)pivot語(yǔ)法的簡(jiǎn)單演示,使用emp表,在轉(zhuǎn)換前,先看一下基礎(chǔ)數(shù)據(jù):
--用例1:?jiǎn)瘟修D(zhuǎn)換
這里將通過(guò)deptno和job來(lái)匯總sal1,然后轉(zhuǎn)換對(duì)deptno的匯總到它們各自的列上
需要聚合的列:sal1
需要轉(zhuǎn)換的列:deptno
轉(zhuǎn)換的列需要過(guò)濾的值:10,20,30,40
關(guān)于這個(gè)例子需要注意的地方:
pivot操作實(shí)際執(zhí)行了隱式的GROUP BY,使用的列是沒(méi)有出現(xiàn)在pivot_clause中的列(本例為job和deptno),大多數(shù)的轉(zhuǎn)換查詢(xún)都是在列的特定的子集上來(lái)執(zhí)行。像所有的聚合查詢(xún)一樣,額外列的出現(xiàn)會(huì)影響分組。在本例中,除了sal 1列,其余所有列都成了分組集,其中deptno為轉(zhuǎn)換列?;A(chǔ)數(shù)據(jù)中的其他列如ename等如果加入就會(huì)影響分組,所以可以使用子查詢(xún)等來(lái)定義基列的集合,例子中的SELECT deptno, job, sal 1 FROM emp作用就是定義基列的集合。
--用例2:所有列都參與的效果:
本例中,除了sal 1列,其余所有列都成了分組集,其中deptno為轉(zhuǎn)換列。這個(gè)轉(zhuǎn)換沒(méi)有什么意義。
--用例3:with as
下面再舉一個(gè)with as子查詢(xún)的例子,效果與上述內(nèi)聯(lián)視圖結(jié)果一致。
--用例4:多列轉(zhuǎn)換
上面的例子中 pivot_clause 中定義 2 個(gè)聚合,這里得到的轉(zhuǎn)換列是雙倍(因?yàn)榫酆系臄?shù)量是雙倍)。
轉(zhuǎn)換列的數(shù)量=聚合列的數(shù)量 * pivot_in_clause 中值的個(gè)數(shù)(2*2=4),
轉(zhuǎn)換列的數(shù)量不能超過(guò) 1024。
--用例5,多列多值轉(zhuǎn)換
GBase 8s Pivot轉(zhuǎn)換查詢(xún)注意事項(xiàng)
在 pivot_for_clause 中使用的列(如例子中為 deptno 列)不能出現(xiàn)在SELECT投影列中,在 pivot_for_clause 中的列會(huì)根據(jù)我們?cè)?pivot_in_clause中提供的值的范圍進(jìn)行分組。下列中試圖查詢(xún) deptno 列,會(huì)引發(fā)異常,因?yàn)檫@種情況下,deptno完全從投影中被移除了。
同樣也不能查詢(xún)?nèi)魏纬霈F(xiàn)在pivot_clause 中的列。比如試圖查詢(xún) sal1 列,也會(huì)引發(fā)了同樣的異常。
pivot_clause中的列必須使用聚合函數(shù),沒(méi)有使用聚合函數(shù),也會(huì)引發(fā)異常。
pivot_in_clause 中,如果指定別名就用別名,如果沒(méi)有指定就用值當(dāng)列名;而 pivot_clause中如果指定別名就連接到pivot_in_clause 轉(zhuǎn)換后的相應(yīng)列的名稱(chēng)的后面,如果沒(méi)有指定就不用。pivot_clause中有多個(gè)聚合函數(shù)時(shí),8s允許都不設(shè)置別名,8s會(huì)自動(dòng)在后面加上_1,_2..依次類(lèi)推。別名都不支持加單引號(hào)。
其他使用上的限制,可參考《GBase 8s V8.8 SQL 指南:語(yǔ)法.pdf》
GBase 8s數(shù)據(jù)庫(kù)官方文檔:http://metatradingfloor.com/download/gbase-8s-1?category=DOCUMENT
南大通用GBase技術(shù)社區(qū):http://metatradingfloor.com/community
通過(guò)本文的介紹,您可能已經(jīng)對(duì)GBase 8s中的Pivot功能有了全面的認(rèn)識(shí)。它不僅僅是一個(gè)簡(jiǎn)單的數(shù)據(jù)轉(zhuǎn)換工具,更是數(shù)據(jù)分析的利器。下一篇文章,我們會(huì)展開(kāi)介紹Unpivot的使用技巧,感謝您的閱讀。