1. 程式人生 > >oracle行轉列、列轉行

oracle行轉列、列轉行

行轉列:PIVOT

列轉行:UNPIVOT

這兩個是在oracle11g上面新增的函式。下面舉例說明用法。

PIVOT:

學生成績表,原資料:

select class_name, student_name, course_type, result, created_date
  from class_tmp_2;


每個同學的兩門成績,是兩條資料,因為業務需要,展示給使用者看的時候,使用者想要每個同學只要一條資料,並且把所有成績都展示出來,比如

這個時候就需要用到行專列函式PIVOT.

SELECT class_name, student_name, 語文, 數學, created_date
  FROM (SELECT CLASS_NAME, STUDENT_NAME, COURSE_TYPE, RESULT, CREATED_DATE
          FROM CLASS_TMP_2
) T PIVOT(SUM(RESULT) FOR COURSE_TYPE IN('語文' AS 語文, '數學' AS 數學));

淺灰色的sql和上面的原資料sql一樣,主要看一下後面的PIVOT部分。

sum(result):成績之和(PIVOT內需有聚集函式)

for course_type in ('語文' as語文, '數學' as數學):將course_type列的欄位值轉換成列名,其中,欄位值是'語文',轉換成語文列,欄位值是'數學',轉換成數學列,這兩列的欄位值,即前面的sum(result)。

不用函式也可以得到,如下sql:

select t1.class_name,
       t1.student_name,
       t1.result       語文,
       t2.result       數學,
       t1.created_date
  from (select a.class_name,
               a.student_name,
               a.course_type,
               a.result,
               a.created_date
          from class_tmp_2 a
         where a.course_type = '語文') t1,
       (select a.class_name,
               a.student_name,
               a.course_type,
               a.result,
               a.created_date
          from class_tmp_2 a
         where a.course_type = '數學') t2
 where t1.class_name = t2.class_name
   and t1.student_name = t2.student_name;

UNPIVOT:列轉行

反過來,原資料如下:


而我想要得到的結果如下:


SQL:

select class_name, student_name, course_type, result, created_date
  from class_tmp 
  unpivot(result for course_type in(chinese_result,math_result));

原資料的chinese_result列和math_result列的列名(淺灰色),將轉換為新建列course_type的欄位值,表示課種。

原資料的chinese_result列和math_result列的欄位值,將轉換為新建列result

的欄位值,表示分數。

相關推薦

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

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

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字串,轉行的Sql語句總結

多行轉字串這個比較簡單,用||或concat函式可以實現 SQL Code 12select concat(id,username) str from app_userselect id||username str from app_user字串轉多列實際上就是拆分字串的問題

oracle轉行

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

Oracle SQL函式pivotunpivot置函式實現轉行

函式PIVOT、UNPIVOT轉置函式實現行轉列、列轉行,效果如下圖所示: 1.PIVOT為行轉列,從圖示的左邊到右邊 2.UNPIVOT為列轉行,從圖示的右邊到左邊 3.左邊為縱表,結構簡單,易擴充套件 4.右邊為橫表,展示清晰,方便查詢 5.很多時候業務表為縱表,但是統

使用case when,union all實現sql轉行

-- 建表 CREATE TABLE StudentScores ( UserName NVARCHAR(20), -- 學生姓名 Subject

oracle 轉行

目錄結構如下: 行轉列 列轉行 [一]、行轉列 1.1、初始測試資料 表結構:TEST_TB_GRADE Sql程式碼   createtable TEST_TB_GRADE   (     ID        NUMBER(10) notnull,

轉行題目(收集中...)

一、列轉行 1、把如下表 year  month amount 1991   1     1.1 1991   2     1.2 1991   3     1.3 1991   4     1.4

SQL轉行

SQL行轉列、列轉行 這個主題還是比較常見的,行轉列主要適用於對資料作聚合統計,如統計某類目的商品在某個時間區間的銷售情況。列轉行問題同樣也很常見。 一、整理測試資料 create table wyc

mysql-轉行

group_concat(),函式說明     手冊上說明:該函式返回帶有來自一個組的連線的非NULL值的字串結果;     通俗點理解,其實是這樣的:group_concat()會計算哪些行屬於同一組,將屬於同一組的列顯示出來。要返回哪些列,由函式引數(就是欄位名)決定。分組必須有個標準,就是根據grou

刪除重複資料轉行

查詢是否有重複資料http://write.blog.csdn.net/postedit/53517081 select name,conunt(*) from test group by name having count(*)>1; 刪除重複資料 delete a

MySQL的轉行連線字串 concatconcat_wsgroup_concat函式用法

1.concat函式 使用方法: CONCAT(str1,str2,…) 返回結果為連線引數產生的字串。如有任何一個引數為NULL ,則返回值為 NULL。 注意: 如果所有引數均為非二進位制字串,則結果為非二進位制字串。 如果自變

Databricks 第11篇:Spark SQL 查詢(轉行Lateral View排序)

本文分享在Azure Databricks中如何實現行轉列和列轉行,並介紹對查詢的結果進行排序的各種方式。 一,行轉列 在分組中,把每個分組中的某一列的資料連線在一起: collect_list:把一個分組中的列合成為陣列,資料不去重,格式是['a','a','b'] collect_set:把一個分組中的

Oracle

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

oracle ,多

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

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

SQL Server 轉行。多成一

一、多行轉成一列(並以","隔開)表名:A表資料:想要的查詢結果:查詢語句:SELECT name , value = ( STUFF(( SELECT ',' + value FROM A

Oracle 小結

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