elasticsearch入門系列">elasticsearch入門系列
760
2022-05-30
?? 原題 ??
?? 解題思路 ??
Pivot 函數(shù)簡介
創(chuàng)建測(cè)試表 Department
插入測(cè)試數(shù)據(jù)
執(zhí)行 Pivot 行轉(zhuǎn)列函數(shù)
?? 原題 ??
?? 解題思路 ??
Pivot 函數(shù)簡介
創(chuàng)建測(cè)試表 Department
插入測(cè)試數(shù)據(jù)
執(zhí)行 Pivot 行轉(zhuǎn)列函數(shù)
?? 寫在最后
?? 原題 ??
部門表 Department:
+---------------+---------+ | Column Name | Type | +---------------+---------+ | id | int | | revenue | int | | month | varchar | +---------------+---------+ (id, month) 是表的聯(lián)合主鍵。 這個(gè)表格有關(guān)于每個(gè)部門每月收入的信息。 月份(month)可以取下列值 ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]。
編寫一個(gè) SQL 查詢來重新格式化表,使得新的表中有一個(gè)部門 id 列和一些對(duì)應(yīng) 每個(gè)月 的收入(revenue)列。
查詢結(jié)果格式如下面的示例所示:
Department 表: +------+---------+-------+ | id | revenue | month | +------+---------+-------+ | 1 | 8000 | Jan | | 2 | 9000 | Jan | | 3 | 10000 | Feb | | 1 | 7000 | Feb | | 1 | 6000 | Mar | +------+---------+-------+ 查詢得到的結(jié)果表: +------+-------------+-------------+-------------+-----+-------------+ | id | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue | +------+-------------+-------------+-------------+-----+-------------+ | 1 | 8000 | 7000 | 6000 | ... | null | | 2 | 9000 | null | null | ... | null | | 3 | null | 10000 | null | ... | null | +------+-------------+-------------+-------------+-----+-------------+ 注意,結(jié)果表有 13 列 (1個(gè)部門 id 列 + 12個(gè)月份的收入列)。
?? 解題思路 ??
Pivot 函數(shù)簡介
通過審題可以發(fā)現(xiàn),需要將月份的值 12 個(gè)月轉(zhuǎn)化為 查詢結(jié)果中的 12 個(gè)列。這就是明顯的 行轉(zhuǎn)列 格式化。
Oracle 11G 中出現(xiàn)的新特性 Pivot 行轉(zhuǎn)列函數(shù)正好可以解此題。
下面先了解一下 Pivot 函數(shù),主要用于進(jìn)行行轉(zhuǎn)列操作。
基本語法如下:
SELECT ... FROM ... PIVOT [XML] ( pivot_clause pivot_for_clause pivot_in_clause ) WHERE ...
下面我們直接通過 LeetCode 題目實(shí)驗(yàn)來學(xué)習(xí)一下:
創(chuàng)建測(cè)試表 Department
CREATE TABLE department ( id NUMBER, revenue NUMBER, month VARCHAR2(10) );
插入測(cè)試數(shù)據(jù)
INSERT INTO department VALUES (1, 8000, 'Jan'); INSERT INTO department VALUES (1, 7000, 'Feb'); INSERT INTO department VALUES (1, 6000, 'Mar'); INSERT INTO department VALUES (2, 9000, 'Jan'); INSERT INTO department VALUES (3, 10000, 'Feb'); commit;
執(zhí)行 Pivot 行轉(zhuǎn)列函數(shù)
根據(jù)題意:已確定需要查出的列為 ID 和 12個(gè)月份,月份列對(duì)應(yīng)的 REVENUE 的值需要進(jìn)行匯總 (SUM) 顯示。
SELECT * FROM department PIVOT (SUM(revenue) as "Revenue" for month in ( 'Jan' as "Jan", 'Feb' as "Feb", 'Mar' as "Mar", 'Apr' as "Apr", 'May' as "May", 'Jun' as "Jun", 'Jul' as "Jul", 'Aug' as "Aug", 'Sep' as "Sep", 'Oct' as "Oct", 'Nov' as "Nov", 'Dec' as "Dec" ));
??
格式化結(jié)果與原題所需要求保持一致,解題完成。
??
?? 寫在最后
關(guān)于 Pivot 行轉(zhuǎn)列函數(shù),還有 UNPivot 函數(shù),感興趣的朋友可以翻閱官方文檔,或者參考以下文章:
PIVOT and UNPIVOT Operators in Oracle Database 11g Release 1
本次分享到此結(jié)束啦~
如果覺得文章對(duì)你有幫助,
、、關(guān)注、評(píng)論
,一鍵四連支持,你的支持就是我創(chuàng)作最大的動(dòng)力。
Oracle 數(shù)據(jù)結(jié)構(gòu)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。