Oracle中pivot函式詳解

systemctl1發表於2024-05-13

【基本介紹】
【格式】:pivot(聚合函式 for 需要轉為列的欄位名 in(需要轉為列的欄位值))

【說明】:實現將指定欄位的欄位值轉換為列的效果。

【環境】:如下圖是樣例展示所使用的oracle版本。

【準備樣例資料】
樣例資料如下圖所示:

NAME-學生姓名,SUBJECT-考試科目,GRADES-考試成績。

【樣例展示1】
實行如下sql語句:

select * from T_Student_Grades
pivot
(
sum(grades)
for name in('張三','李四','王五')
)

返回結果如下:按指定科目統計所有學生的總成績,並將學生姓名欄位行轉列顯示(此時雖然用到了聚合函式sum,由於SUBJECT欄位也一併顯示,因此sum函式並沒有起到效果,顯示依舊是每一個學生的各科具體成績)。

【樣例展示2】
實行如下sql語句:

select * from T_Student_Grades
pivot
(
avg(grades)
for name in ('張三' as 張三,'李四' as 李四,'王五' as 王五)
)

返回結果如下:按指定科目統計所有學生的平均成績,並將學生姓名欄位行轉列,顯示別名(此時雖然用到了聚合函式avg,由於SUBJECT欄位也一併顯示,因此avg函式並沒有起到效果,顯示依舊是每一個學生的各科具體成績)。

【樣例展示3】
實行如下sql語句:

select * from (select name,grades from T_Student_Grades)
pivot
(
sum(grades)
for name in ('張三','李四','王五')
)

返回結果如下:統計每一個學生的所有科目總成績,並將學生姓名欄位行轉列(SUBJECT欄位沒有顯示)。

【樣例展示4】
實行如下sql語句:

select * from T_Student_Grades
pivot
(
max(grades)
for name in ('張三' as 張三,'李四' as 李四,'王五' as 王五)
)
where subject='數學'

返回結果如下:按指定科目統計所有學生的最高成績,並將學生姓名欄位行轉列,並且只顯示數學這一科目的成績(此時雖然用到了聚合函式max,由於SUBJECT欄位也一併顯示,因此max函式並沒有起到效果,依舊是顯示每一個學生的各科具體成績)。

【樣例展示5】
實行如下sql語句:

select * from T_Student_Grades
pivot
(
min(grades)
for name in ('張三' as 張三,'李四' as 李四,'王五' as 王五)
)
where 張三='90'

返回結果如下:按指定科目統計所有學生的最低成績,並將學生姓名欄位行轉列,並且只顯示數學這一科目的成績(此時雖然用到了聚合函式max,由於SUBJECT欄位也一併顯示,因此max函式並沒有起到效果,依舊是顯示每一個學生的各科具體成績)。

【樣例展示6】
實行如下sql語句(in中使用子查詢):

select * from T_Student_Grades
pivot
(
count(grades)
for name in (select distinct name from T_Student_Grades)
)

報錯提示:ORA-00936:確實表示式,如下圖所示,看來in不支援子查詢。


————————————————

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。

原文連結:https://blog.csdn.net/qq_40018576/article/details/128287105

相關文章