Oracle行轉列操做

有時候咱們在展現表中數據的時候,須要將行轉爲列來顯示,如如下形式:sql

原表結構展現以下:
---------------------------
產品名稱    銷售額     季度
---------------------------
奶酪          50     第一季度
奶酪          60     第二季度
啤酒          50     第二季度
啤酒          80     第四季度
---------------------------數據庫

如今須要將上面的原表結構轉換爲以下所示的結構形式來展現:
--------------------------------------------------------------------------
產品名稱   第一季度銷售額   第二季度銷售額   第三季度銷售額   第四季度銷售額
--------------------------------------------------------------------------
奶酪      50        60               0                0
啤酒      0        50               0                80
--------------------------------------------------------------------------函數

1、建立銷售表sale_hst表結構spa

複製代碼
--建立銷售表
create table sale_hst
(
    prdt_name varchar2(10),--產品名稱
    sale_amt number(8),--銷售額
    season varchar2(10)--季度
);
複製代碼

2、插入基礎數據code

--插入如上所示的基礎數據
insert into sale_hst values ('奶酪',50,'第一季度');
insert into sale_hst values ('奶酪',60,'第二季度');
insert into sale_hst values ('啤酒',50,'第二季度');
insert into sale_hst values ('啤酒',80,'第四季度');

3、使用SQL語句轉換blog

方案1:使用case...when...then...else...end...語句產品

複製代碼
--方案1:使用case...when...then...else...end...語句
select
    prdt_name,
    sum(case when season='第一季度' then sale_amt else 0 end) 第一季度銷售額,
    sum(case when season='第二季度' then sale_amt else 0 end) 第二季度銷售額,
    sum(case when season='第三季度' then sale_amt else 0 end) 第三季度銷售額,
    sum(case when season='第四季度' then sale_amt else 0 end) 第四季度銷售額
from sale_hst
group by prdt_name;
複製代碼

方案2:Oracle下能夠用decode函數處理it

說明:table

Oracle下能夠用decode函數處理:
decode函數是Oracle PL/SQL中功能強大的函數之一,目前還只有Oracle公司的SQL提供了此函數,其餘數據庫廠商的SQL實現尚未此功能。

decode函數功能以下:
decode(字段或字段的運算,值1,值2,值3) 
這個函數運行的結果是,當字段或字段的運算的值等於值1時,該函數返回值2,不然返回值3
固然值1,值2,值3也能夠是表達式,這個函數使得某些sql語句簡單了許多。class

複製代碼
--方案2:Oracle下能夠用decode函數處理
select
    prdt_name,
    sum(decode(season,'第一季度',sale_amt,0)) as 第一季度銷售額,
    sum(decode(season,'第二季度',sale_amt,0)) as 第二季度銷售額,
    sum(decode(season,'第三季度',sale_amt,0)) as 第三季度銷售額,
    sum(decode(season,'第四季度',sale_amt,0)) as 第四季度銷售額
from sale_hst
group by prdt_name;
複製代碼

有時候咱們又有以下的需求:

原表的數據形式展現以下:

shopping表:
----------------------------------
u_id       goods            num
----------------------------------
1           蘋果               2
2           梨子               5
1           西瓜               4
3           葡萄               1
3           香蕉               1
1           橘子               3
----------------------------------

轉換爲以下的形式1展現:

--------------------------------------------
u_id          goods_sum    total_num
--------------------------------------------
1             蘋果,西瓜,橘子      9
2             梨子           5
3             葡萄,香蕉         2
--------------------------------------------

轉換爲以下的形式2展現:
------------------------------------------------------
u_id          goods_sum          total_num
------------------------------------------------------
1             蘋果(2斤),西瓜(4斤),橘子(3斤)    9
2             梨子(5斤)              5
3             葡萄(1斤),香蕉(1斤)         2
------------------------------------------------------

1、建立購物表shopping表結構

複製代碼
--建立購物表shopping
create table shopping
(
    u_id number(10),
    goods varchar2(8),
    num number(10)   
);
複製代碼

 2、插入基礎數據

複製代碼
--插入如上所示的基礎數據
insert into shopping values (1,'蘋果',2);
insert into shopping values (2,'梨子',5);
insert into shopping values (1,'西瓜',4);
insert into shopping values (3,'葡萄',1);
insert into shopping values (3,'香蕉',1);
insert into shopping values (1,'橘子',3);
複製代碼

3、使用SQL語句轉換

形式1:

--形式1的語句
select u_id, wmsys.wm_concat(goods) goods_sum,sum(num) total_num  from shopping   group by u_id;

形式2:

--形式2的語句
select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum,sum(num) total_num  from shopping  group by u_id;

說明:

Oracle中wm_concat(column)函數的使用:
wmsys用戶的wm_concate函數
Oracle數據庫中,使用wm_concat(column)函數,能夠進行字段合併,Oracle中的wmsys.wm_concat主要實現行轉列功能(說白了就是將查詢的某一列值使用逗號進行隔開拼接,成爲一條數據)。wmsys.wm_concat除了單獨使用外還能夠和over函數結合使用。

相關文章
相關標籤/搜索