1. 程式人生 > >Oracle 行轉列小結

Oracle 行轉列小結

      最近在工作中,對行轉列進行了應用,在此做一個簡單的小結。

      轉換過程如下:

    1、建立表結構

CREATE TABLE RowToCol 
( 
  ID NUMBER(10) not null, 
  USER_NAME VARCHAR2(20 CHAR), 
  COURSE VARCHAR2(20 CHAR), 
  SCORE VARCHAR2(20 CHAR)
) 

        2、插入測試資料(原始資料如圖)

        

        3、行轉列實現效果

        

        4、具體實現

        主要原理是利用decode函式、聚集函式(sum/max/min/avg),結合group by分組實現的,具體sql如下:

select t.user_name as 姓名,
    MAX(decode(t.course,'語文',score,null)) as 語文,
    MAX(decode(t.course,'數學',score,null)) as 數學,
    MAX(decode(t.course,'英語',score,null)) as 英語
from RowToCol t group by t.user_name  order by t.user_name
      
      *當要分組的值,如例子中的score列是數值型,則聚集函式可以使用sum/max/min/avg,但是字元行的只能使用max/min。

------------------------------------------------------------------------------------------------------------------------------------------------------

      附註:

      decode函式:

      它是一種特有的函式計算方式,相當於計算機語言中的if...else...

       decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,預設值)

      其理解為:

if (條件==值1)
 then    
return(翻譯值1)
elsif (條件==值2)
then    
return(翻譯值2)    
......
elsif (條件==值n)
 then    
return(翻譯值n)
else    
return(預設值)
end if

      行轉列包括行轉列、列轉行、多列轉換成字串、多行轉換成字串、字串轉換成多行和字串轉換成多列六種情況,如果大家有興趣,可以進行進一步的研究。

相關推薦

Oracle 小結

      最近在工作中,對行轉列進行了應用,在此做一個簡單的小結。       轉換過程如下:     1、建立表結構 CREATE TABLE RowToCol ( ID NUMBE

Oracle

cat pre case nbsp 運用 分隔 nvl ase partition 一、簡易運用 ——>沒轉之前一個主號綁定多個副號的多行輸出(像移動的歡樂在線) SELECT f.town_name 鎮區, f.school_name 學校,

oracle ,多

問題描述:    應公司要求,設計功能,一個ID,對應不同的值,展示的時候不同的值拼接展示,如何實現;   解決思路:     1) 拼接字串,想到了 oracle  Function(),這樣肯定能實現,但是比較麻煩;

小結

一、建立測試環境 1.建立測試資料​​​​​​ create table cc (     student   nvarchar2(2),     course    nvarchar2(2),     score     int ); 2.插入測試資料 Insert

oracle轉行、連續日期數字實現方式及mybatis下實現方式

九月份複習,十月份考試,十月底一直沒法收心,趕在十一初 由於不可抗拒的原因又不得不重新找工作就;欸~, 又是一番折騰,從入職到現在,可又沒法閒下來了... 這次就簡單介紹下oracle資料庫下如何實現行轉列、列轉行及此在mybatis中的實現方式,就具體用法我就不詳細說了,主要介紹下實戰中所碰到的坑

Oracle+排序

--1.刪除臨時表 drop table biz_bus_station_direct_0711; --2.將站點資料等放入臨時表 create table biz_bus_station_direct

Oracle pivot 、轉行unpivot 的Sql語句總結

多行轉字串 這個比較簡單,用||或concat函式可以實現 print? 1.  select concat(id,username) str from app_user   2.     3.  select id||username str from app_use

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轉行

行轉列:PIVOT列轉行:UNPIVOT這兩個是在oracle11g上面新增的函式。下面舉例說明用法。PIVOT:學生成績表,原資料:select class_name, student_name, course_type, result, created_date fr

Oracle pivot函式基本用法

2018年9月30日22點,眼看著就10月份了,回頭看下,8月份就寫了一篇部落格,9月一篇都沒寫,想著還是得續一續。 剛好前幾天,幫一個群友處理了一個關於Oracle中行轉列,根據查詢中有的專案,動態轉列的做法。想著也挺好玩,不過看下時間,不太充足。所以暫時先寫個Oracl

oracle 的通用過程

createorreplaceprocedureproc(tabname invarchar2, col1 invarchar2, col2 invarchar2,

Oracle decode函式

固定列數的行列轉換如 student subject grade---------------------------student1 語文 80student1 數學 70student1 英語 60student2 語文 90student2 數學 80student2

Oracle 兩種方法

log src sco watermark insert core ora 記錄 sel 1.新建一個名為TEST表 2.向TEST表中添加數據 INSERT INTO TEST(STUDENT,COURSE,SCORE)select ‘張三‘,‘語文‘,78 from d

oracle (用函式和遊標完成)

create table students (student_id varchar2(32), student_name varchar2(180), student_age number ) insert into students values('1','金瑞','1

Oracle函式Listagg()和wm_co…

Oracle行轉列函式Listagg()和wm_concat(column)函式 這是一個Oracle的行轉列函式:LISTAGG() 先看示例程式碼: Sql程式碼  WITH T

Oracle的一次經歷

需求如下,由於系統專案改造,之前黨員各個月份的成績如下表所示: 存取資料如下: 新專案表結構作了調整,每個黨員每一年一條記錄,12個月份的資料變成了列欄位,主鍵變成由年份和黨員id構成,表結構如下: 月統計得分和季統計得分的資料儲存是有格式要求

Oracle 總結 Case When,Decode,PIVOT 三種方式

最近又碰到行專列問題了,當時不假思索用的是子查詢,做完後我詢問面試管行專列標正的寫法應該如何寫,他告訴我說應該用"Decode",索性我就總結一下,一共三種方式  --=========建表語句  CREATE TABLE populations(  country VARCHAR2(20),  sex I

oracle 資料量太大報錯

wmsys.wm_concat  這個函式存在缺陷,資料量大的時候,容易報ora-22813     沒辦法只能通過重新定義一個行轉列函式,copy了一下 http://www.savedba.com/?p=955  這個人寫的函式 有點問題,自己又改了下。 drop ty