Oracle Pivot學習心得


  今天在做一個查詢報表需要將多行的查詢結果轉換成一行,數據格式如下

  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,

下圖是執行計划

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM