2010年1月11日 星期一

[Oracle]Mutil Row To One Row應用(二)

本次範例應用北風資料For Oracle中 orders 的訂單資料Table做為Sample。本次範例想要取得訂單資料中每天訂單中每個貨運公司的最大運費,並且有優先次序的選擇呈現貨運公司的資料,例如:如果當天有托運公司1,2,3呈現資料的次序為1 > 2 > 3

select orderid, orderdate, shipvia, freight from orders t




















結果如下:


















解法一:

select orderdate,
       shippers,
       coalesce(shippers1_freight, shippers2_freight, shippers3_freight) shippers_freight
  from (select orderdate,
               min(shipvia) shippers,
               max(decode(shipvia, 1, freight)) shippers1_freight,
               max(decode(shipvia, 2, freight)) shippers2_freight,
               max(decode(shipvia, 3, freight)) shippers3_freight
          from (select to_char(t.orderdate, 'yyyy/mm/dd') orderdate,
                       shipvia,
                       max(t.freight) freight
                  from orders t
                 group by to_char(t.orderdate, 'yyyy/mm/dd'), shipvia)
         group by orderdate
         order by orderdate)

接著就要把SQL分三層一一抽絲剝繭,想當然爾的從最內層開始解說:
  1.  group by to_char(t.orderdate, 'yyyy/mm/dd'), shipvia -- 依據每日每個貨運公司取得最大運費 max(t.freight)。
  2.  Mutil Row To One Row:利用group搭配max函數與decode將三個貨運公司分列為三個欄位。
  3.  利用coalesce函數依優先次數呈現貨運公司的運費。
[註] :coalesce nvl 的加強版。
         nvl( string1, string2 ) =>判斷 string1 如果為 null 則呈現 string2。nvl 無法應付兩個以上null的判斷。
         coalesce(string1, string2, string3) =>判斷 string1 為null則呈現 string2,若 string2  也是null則呈現 string3。
         

沒有留言:

張貼留言