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