使用過SQL Server 2000的人都知道,要想實現行列轉換,必須綜合利用聚合函數和動態SQL,具體實現起來需要一定的技巧,而在SQL Server 2005中,使用新引進的關鍵字PIVOT/UNPIVOT,則可以很容易的實現行列轉換的需求。
在本文中我們將通過兩個簡單的例子詳細講解PIVOT和UNPIVOT的用法。
PIVOT是行轉列,用法如下:
假如表結構如下:
id name quarter profile
1 a 1 1000
1 a 2 2000
1 a 3 4000
1 a 4 5000
2 b 1 3000
2 b 2 3500
2 b 3 4200
2 b 4 5500
----------------------------------------------
使用PIVOT將四個季度的利潤轉換成橫向顯示:
select id,name,
[1] as "一季度",[2] as "二季度",[3] as "三季度",[4] as "四季度"
from test
pivot
(
sum(profile)
for quarter in ([1],[2],[3],[4])
)
as pvt
-----------------------------------------------
得出的結果如下:
id name 一季度 二季度 三季度 四季度
1 a 1000 2000 4000 5000
2 b 3000 3500 4200 5500
========================================================================================
UNPIVOT是列轉行,用法如下:
假如表結構如下:
id name Q1 Q2 Q3 Q4
1 a 1000 2000 4000 5000
2 b 3000 3500 4200 5500
-----------------------------------------------
使用UNPIVOT,將同一行中四個季度的列數據轉換成四行數據:
select id,name,quarter,profile
from test
unpivot
(
profile
for quarter in ([Q1],[Q2],[Q3],[Q4])
)
as unpvt
-----------------------------------------------
得出的結果如下:
id name quarter profile
1 a Q1 1000
1 a Q2 2000
1 a Q3 4000
1 a Q4 5000
2 b Q1 3000
2 b Q2 3500
2 b Q3 4200
2 b Q4 5500
------------------------------------------------------------------------------
設存在如下縱向表,第一列為id(可能是某個業務數據的id),第二列為類型,第三列為類型對應的值,如下圖:
如上表,存在2,3,4三種類型,其中業務數據ID為1的三種類型都有值,業務數據ID為2的三種類型都有值,業務數據ID為3的只有類型2和3有值,現在要把縱向表橫過來顯示,可以采用如下代碼:
- -- =========================================================
- -- 縱向表變橫向表:
- -- 1. 轉換類型,類型的值必須是整數,且不等於0,即0沒有意義,0可以表示為空
- -- =========================================================
- SELECT
- t.id,
- SUM(DECODE(t.code, 2, 2, 0)) "第二項", -- 如果該行類型為2則就是2,其它的都為0
- SUM(DECODE(t.code, 3, 3, 0)) "第三項",
- SUM(decode(t.code, 4, 4, 0)) "第四項"
- FROM ttt t WHERE t.id=1 GROUP BY t.id;
- -- =========================================================
- -- 縱向表變橫向表:
- -- 1. 轉換類型對應的數據,且數據需要是數值,且0沒有意義,即0可以表示為空
- -- =========================================================
- SELECT
- t.id,
- SUM(DECODE(t.code, 2, t.val, 0)) "第二項", -- 如果該行類型為2則顯示2類型對應的值DECODE,否則都顯示0
- SUM(DECODE(t.code, 3, t.val, 0)) "第三項",
- SUM(DECODE(t.code, 4, t.val, 0)) "第四項"
- FROM ttt t GROUP BY t.id;
----------------------------------------------------------------------------------------------------------------------------------------
oracle合並列的函數wm_concat的使用詳解
oracle wm_concat(column)函數使我們經常會使用到的,下面就教您如何使用oracle wm_concat(column)函數實現字段合並,如果您對oracle wm_concat(column)函數使用方面感興趣的話,不妨一看。
shopping:
-----------------------------------------
u_id goods num
------------------------------------------
1 蘋果 2
2 梨子 5
1 西瓜 4
3 葡萄 1
3 香蕉 1
1 橘子 3
=======================
想要的結果為:
--------------------------------
u_id goods_sum
____________________
1 蘋果,西瓜,橘子
2 梨子
3 葡萄,香蕉
---------------------------------
1.select u_id, wmsys.wm_concat(goods) goods_sum 2. 3.from shopping 4. 5.group by u_id
想要的結果2:
--------------------------------
u_id goods_sum
____________________
1 蘋果(2斤),西瓜(4斤),橘子(3斤)
2 梨子(5斤)
3 葡萄(1斤),香蕉(1斤)
---------------------------------
使用oracle wm_concat(column)函數實現:
select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum
from shopping
group by u_id
mysql---group_concat