Oracle 行轉列 pivot函式基本用法
2018年9月30日22點,眼看著就10月份了,回頭看下,8月份就寫了一篇部落格,9月一篇都沒寫,想著還是得續一續。
剛好前幾天,幫一個群友處理了一個關於Oracle中行轉列,根據查詢中有的專案,動態轉列的做法。想著也挺好玩,不過看下時間,不太充足。所以暫時先寫個Oracle自帶的行轉列函式,pivot的基本用法。國慶幾天看下有時間的話完善一下動態轉列的做法,到時候再另寫一篇附連結過來。
一、執行環境
還是先介紹下環境,雖然應該也沒啥影響,Win10,Oracle Database 11g r2,plsql 12。
二、看下結果
三、測試資料準備
--建表 --drop table SalesList; create table SalesList( keHu varchar2(20), --客戶 shangPin varchar2(20), --商品名稱 salesNum number(8) --銷售數量 ); --插入資料 declare --談幾個客戶 cursor lr_kh is select regexp_substr('張三、李四、王五、趙六','[^、]+',1, level) keHu from dual connect by level <= 4; --進點貨 cursor lr_sp is select regexp_substr('上衣、褲子、襪子、帽子','[^、]+',1, level) shangPin from dual connect by level <= 4; begin --迴圈插入 for v_kh in lr_kh loop for v_sp in lr_sp loop insert into SalesList select v_kh.keHu, v_sp.shangPin, floor(dbms_random.value(10,50)) from dual; end loop; end loop; commit; end; /
四、pivot進行轉換的SQL(查詢結果就是上面的結果圖)
--行轉列 select * from SalesList pivot( max(salesNum) for shangPin in ( --shangPin 即要轉成列的欄位 '上衣' as 上衣, --max(salesNum) 此處必須為聚合函式, '褲子' as 褲子, --in () 對要轉成列的每一個值指定一個列名 '襪子' as 襪子, '帽子' as 帽子 ) ) where 1 = 1; --這裡可以寫查詢條件,沒有可以直接不要where
五、轉動態列
有時候可能需要行轉列的值,即shangPin欄位的值的個數很多,或者是不確定個數,那 in () 裡面的部分就不好去寫死,然後,Oracle的pivot其實也是提供了一個轉出動態列的功能,不過轉出來的是xml格式的資料。。。這也是為啥我說要自己寫一個處理的方法的原因了、、、不過具體做法下次再說,現在先看下原汁原味的轉xml的做法,sql如下:
--動態出列(xml的形式) select * from SalesList pivot xml( --pivot xml 以xml的形式輸出 max(salesNum) for shangPin in ( select distinct shangPin from SalesList --通過查詢查出所有需要轉列的值,即所有列名 ) );
還是有點感人的。不過這樣的結果,實在是,,用途不大。
所以呢,要麼,咱們把這個xml的結果,轉換成你要的結果,又要麼呢,咱們寫個儲存過程什麼的,通過一些引數,配置,把資料處理成咱們需要的效果。
我個人是比較傾向與儲存過程處理,可以通過動態sql拼接,或者是迴圈的方式處理,具體實現,下期再聊。
===================================一條低調的分割線================================
2018-10-02,動態轉換的出來了,有興趣的可以看下
相關推薦
Oracle 行轉列 pivot函式基本用法
2018年9月30日22點,眼看著就10月份了,回頭看下,8月份就寫了一篇部落格,9月一篇都沒寫,想著還是得續一續。 剛好前幾天,幫一個群友處理了一個關於Oracle中行轉列,根據查詢中有的專案,動態轉列的做法。想著也挺好玩,不過看下時間,不太充足。所以暫時先寫個Oracl
Oracle 行轉列pivot 、列轉行unpivot 的Sql語句總結
多行轉字串 這個比較簡單,用||或concat函式可以實現 print? 1. select concat(id,username) str from app_user 2. 3. select id||username str from app_use
SQL行轉列PIVOT關鍵字的用法
昨天寫報表遇到行轉列,原來都是使用動態sql來實現,這次嘗試使用了下pivot來實現,pivot是sql server2005後加入的關鍵字,它使用起來比較方便,比起動態sql會簡化很多。 基本語法:select 列1,[A],[B],[C]... from table p
Oracle行轉列 decode函式
固定列數的行列轉換如 student subject grade---------------------------student1 語文 80student1 數學 70student1 英語 60student2 語文 90student2 數學 80student2
oracle 行轉列(用函式和遊標完成)
create table students (student_id varchar2(32), student_name varchar2(180), student_age number ) insert into students values('1','金瑞','1
oracle行轉列函式WMSYS.WM_CONCAT用法
select t.rank, t.Name from t_menu_item t; 10 CLARK 10 KING 10 MILLER 20 ADAMS 20 FORD 20 JONES 20 SCOTT 20 SMITH 30 ALLEN 30 BLAKE 30 JAMES 30 MARTIN 30 T
oracle 11g下的行轉列pivot填坑--xmlType轉clob或String
臨近年關,我們給全公司用的API平臺也到了要裝逼的時刻,然而裝逼利器還沒搞完,那就是報表呈現,於是leader說你來搞一下吧。 echarts肯定是要的,報表呈現還是很完美的。然後就是資料庫層面的了。我們裝的是oracle 11g,這貨提供了pivot來進行轉列,然而它是有坑的,本次記錄的就是這個。 pi
Oracle的行轉列的函式wm_concat的db2實現
oracle的行轉列的函式wm_concat的功能很強大,db2同樣有個名叫聚合函式listagg()可以實現此功能 select listagg(id,',') from student; listagg函式的詳細介紹:
Oracle行轉列函式Listagg()和wm_co…
Oracle行轉列函式Listagg()和wm_concat(column)函式 這是一個Oracle的行轉列函式:LISTAGG() 先看示例程式碼: Sql程式碼 WITH T
Oracle 行轉列總結 Case When,Decode,PIVOT 三種方式
最近又碰到行專列問題了,當時不假思索用的是子查詢,做完後我詢問面試管行專列標正的寫法應該如何寫,他告訴我說應該用"Decode",索性我就總結一下,一共三種方式 --=========建表語句 CREATE TABLE populations( country VARCHAR2(20), sex I
Oracle 行轉列
cat pre case nbsp 運用 分隔 nvl ase partition 一、簡易運用 ——>沒轉之前一個主號綁定多個副號的多行輸出(像移動的歡樂在線) SELECT f.town_name 鎮區, f.school_name 學校,
sql的行轉列(PIVOT)與列轉行(UNPIVOT)
列轉行 gif 而且 碼農 實現 score username info rect 在做數據統計的時候,行轉列,列轉行是經常碰到的問題。case when方式太麻煩了,而且可擴展性不強,可以使用 PIVOT,UNPIVOT比較快速實現行轉列,列轉行,而且可擴展性強
oracle 行轉列,多行轉列
問題描述: 應公司要求,設計功能,一個ID,對應不同的值,展示的時候不同的值拼接展示,如何實現; 解決思路: 1) 拼接字串,想到了 oracle Function(),這樣肯定能實現,但是比較麻煩;
oracle行轉列、列轉行、連續日期數字實現方式及mybatis下實現方式
九月份複習,十月份考試,十月底一直沒法收心,趕在十一初 由於不可抗拒的原因又不得不重新找工作就;欸~, 又是一番折騰,從入職到現在,可又沒法閒下來了... 這次就簡單介紹下oracle資料庫下如何實現行轉列、列轉行及此在mybatis中的實現方式,就具體用法我就不詳細說了,主要介紹下實戰中所碰到的坑
Oracle行轉列+排序
--1.刪除臨時表 drop table biz_bus_station_direct_0711; --2.將站點資料等放入臨時表 create table biz_bus_station_direct
oracle 行轉列例子程式碼
select * from (select deptno,job,sal from emp) pivot( sum(sal) for job in ( 'ANALYST' as analyst_sal, 'MA
偶遇Oracle行轉列
行轉列應該是資料庫比較常見的操作了,在oracle中可以使用pivot、decode,可以參考呆瓜的blog: SELECT name, MAX(DECODE(course, 'j
oracle 行轉列,列轉行
目錄結構如下: 行轉列 列轉行 [一]、行轉列 1.1、初始測試資料 表結構:TEST_TB_GRADE Sql程式碼 createtable TEST_TB_GRADE ( ID NUMBER(10) notnull,
Oracle 行轉列小結
最近在工作中,對行轉列進行了應用,在此做一個簡單的小結。 轉換過程如下: 1、建立表結構 CREATE TABLE RowToCol ( ID NUMBE
oracle行轉列、列轉行
行轉列:PIVOT列轉行:UNPIVOT這兩個是在oracle11g上面新增的函式。下面舉例說明用法。PIVOT:學生成績表,原資料:select class_name, student_name, course_type, result, created_date fr