1. 程式人生 > >Oracle 行轉列 pivot函式基本用法

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

SQLPIVOT關鍵字的用法

昨天寫報表遇到行轉列,原來都是使用動態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填坑--xmlTypeclob或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