Oracle行轉列的幾種思路

2021-10-02 21:10:55 字數 4066 閱讀 1786

這裡主要介紹三種行轉列的方式,其中方式一為傳統的方式實現行轉列,在這一節中我們分別介紹行轉列中值為求個數、數字以及字串三種方式;方式二主要借助11g新增加的函式pivot實現;方式三利用pivot和xml解決了方式二中硬編碼的缺陷。

oracle版本:11g.2.0.4_x64

--建立資料表

create table stu(id int,name varchar2(20),course varchar(20),score int,lev varchar(5));

--插入資料

insert into stu(id,name,course,score,lev)

select 1,'張三','語文',90,'優' from dual

union select 2,'張三','數學',80,'良' from dual

union select 3,'張三','英語',70,'中' from dual

union select 4,'李四','語文',60,'差' from dual

union select 5,'李四','數學',91,'優' from dual

union select 6,'李四','英語',81,'良' from dual

union select 7,'王五','語文',71,'中' from dual

union select 8,'王五','數學',61,'差' from dual

union select 9,'王五','英語',51,'差' from dual;

--資料提交

主要是利用decode函式、聚合函式(如max、sum等)、group by分組實現的行轉列的功能。此種方式主要針對oracle在11g之前沒有提供pivot函式實現的方式,然而方式三的listarr也是11g出現的函式。

3.2.1 sql語句

select t.name, count(decode(t.course, '語文', 1)) as "語文",

count(decode(t.course, '數學', 1)) as "數學",

count(decode(t.course, '英語', 1)) as "英語"

from stu t group by t.name;

3.2.2 查詢結果

3.2.3 decode介紹

1)語法

decode(條件,值1,返回值1,值2,返回值2,...值n,返回值n,預設值);
2)例子

decode(欄位或字段的運算,值1,值2,值3)
這個函式執行的結果是,當字段或字段的運算的值等於值1時,該函式返回值2,否則返回值3.當然值1,值2,值3也可以是表示式,這個函式使得某些sql語句簡單了許多.

3.3.1 sql語句

select t.name, sum(decode(t.course, '語文', score)) as "語文",

sum(decode(t.course, '數學', score)) as "數學",

sum(decode(t.course, '英語', score)) as "英語"

from stu t group by t.name;

3.3.2 結果

3.4.1 sql語句

select t.name, (listagg(decode(t.course, '語文', t.lev),',') within group(order by t.course)) as "語文",

(listagg(decode(t.course, '數學', t.lev),',') within group(order by t.course)) as "數學",

(listagg(decode(t.course, '英語', t.lev),',') within group(order by t.course)) as "英語"

from stu t group by t.name;

3.4.2 查詢結果

3.4.3 listagg函式說明

1)作用

可以實現將多列記錄聚合為一列記錄,實現資料的壓縮

2)語法

listagg(measure_expr,delimiter) within group ( order by order_by_clause);
1.listagg函式的第乙個引數是需要顯示的字段;

2.第二個引數是數值之間的分隔符;

3.同時還需要進行排序和分組within group (order by name)

oracle 11g後,出現pivot,更簡便地實現「行轉列」。使用前,需確定資料庫環境大於11g,最好也確認下生產環境的資料庫是否大於11g,避免專案後期出現狀況。

4.1.1 sql

select * from (select t.name, t.course from stu t)  pivot(count(1) for course in ('語文', '數學', '英語'));
4.1.2 結果

select * from (select t.name, t.course, t.score from stu t)  pivot(sum(score) for course in ('語文', '數學', '英語'));
4.2.2 結果

select * from (select t.name, t.course, t.lev from stu t)  pivot((listagg(lev,',') within group(order by course)) for course in ('語文', '數學', '英語'));
4.3.2 結果

使用經典的方法和pivot方法,deptno的引數是硬編碼的。而通過pivot xml能解決這一問題,使分列條件可以是動態的。但,輸出的是xml的clob的格式。這裡只是簡單說明一下。

select * from (select t.name, t.course from stu t) pivot xml (count(1) for course in (select course from stu));
我們很容易看出第二列是乙個xml字串,我們先看一下xml的內容:

數學

1 英語

1 語文

1

這樣我們可以通過解析xml也可以得到相同的結果。

oracle 行轉列,多行轉列

問題描述 應公司要求,設計功能,乙個id,對應不同的值,展示的時候不同的值拼接展示,如何實現 解決思路 1 拼接字串,想到了 oracle function 這樣肯定能實現,但是比較麻煩 2 oracle 自帶的乙個函式 wm concat 函式 非常給力 上 測試表1 create table c...

oracle 行轉列 列轉行(幾種方法)

工作中,我們經常會碰到行轉列的情況 這裡我介紹幾種簡單的方法 行轉列 1.oracle的pivot函式 原表 使用pivot函式 with temp as select 四川省 nation 成都市 city,第一 ranking from dual union all select 四川省 nat...

oracle 行轉列 列轉行的幾種方法

這裡我介紹幾種簡單的方法 行轉列 1.oracle的pivot函式 原表 使用pivot函式 with temp as select 四川省 nation 成都市 city,第一 ranking from dual union all select 四川省 nation 綿陽市 city,第二 ra...