今天在做一個查詢報表需要將多行的查詢結果轉換成一行,數據格式如下
ID Type Parameter Value Machine_NO Operator UpdateTime
1 111111111111 DS after 155.780000 P2-2222 88888888 2014/6/5 11:52:13
2 111111111111 DS airbag 0.850000 P2-2222 88888888 2014/6/5 11:52:40
3 111111111111 DS before 163.570000 P1-1111 00000000 2014/6/5 11:30:05
4 111111111111 DS delta 22.990000 P2-2222 88888888 2014/6/5 11:52:25
5 111111111111 IJ after 163.570000 P1-1111 00000000 2014/6/5 11:29:57
6 111111111111 IJ before 133.640000 P1-1111 00000000 2014/6/5 11:21:51
7 111111111111 IJ delta 29.9300001 P1-1111 00000000 2014/6/5 11:30:21
需要將這7行數據轉換成2行數據,將同一ID同一Type不同的parameter的Value值放到同一行中。
如下的結果

如果用拼接的方法來完成這個任務雖然能達到同樣的效果,但是SQL非常長不易理解。而且SQL語句的執行效率很低很浪費數據庫資源。
在ORACLE 中有一個函數(Pivot)可以很容易的達到這個效果
用法Select * From 表名
PIVOT
(
SUM('要合並的列1'),MAX('要合並的列2'),....FOR 將值轉換成列的列名 IN
(列值1,列值2,列值3,列值4....)
)
從用法中可以看出sum,max是配合PIVOT聚合函數,聚合函數必須要有。
實際用例:
select *
from (
select ID,
Type,
parameter,
value,
machine_no,
Operator,
update_time
from tableName)
pivot(
max(value) as value,
max(machine_no) as machine_no,
max(Operator) as Operator,
max(update_time) as update_time
for parameter in(
'before' as Before,
'after' as After,
'delta' as Delta,
'airbag' as AirBag )
)
where ID= '111111111111'
在轉換過程中生成的新列名是由上面紅色字組合成的,生成的新列數為4*4=16列。例:Before_Value Before_Machine_No,Before_Operator,
下圖是執行計划

