DB/Query

Pivot & Unpivot(multi column) Sample

시처럼 음악처럼 2014. 7. 18. 14:58

/* Pivot */

WITH wdata AS

(

    SELECT '1001' user_id, 'USE' org, 'Boss'  position, 'EN' lang, 100 qty, 25000 amt FROM dual UNION ALL

    SELECT '1001' user_id, 'USD' org, 'Bossa' position, 'FI' lang, 200 qty, 30000 amt FROM dual UNION ALL

    SELECT '1002' user_id, 'GWR' org, 'Dim'   position, 'SV' lang, 300 qty, 35000 amt FROM dual UNION ALL

    SELECT '1003' user_id, 'GGA' org, 'DCS'   position, 'FI' lang, 400 qty, 40000 amt FROM dual UNION ALL

    SELECT '1003' user_id, 'GCA' org, 'DDD'   position, 'SV' lang, 500 qty, 45000 amt FROM dual 

)

SELECT *

FROM   wdata

PIVOT 

(

    MIN(org) AS org,

    MIN(position) AS position,

    SUM(qty) AS qty,

    SUM(amt) AS amt

    FOR lang

    IN ('EN' AS en, 'FI' AS fi, 'SV' AS sv)

);



/* Unpivot */      

WITH wdata AS

(

    SELECT '1001' user_id, 'USE' org, 100 en_qty, 25000 en_amt, 130 fi_qty, 25300 fi_amt, 170 sv_qty, 25700 sv_amt FROM dual UNION ALL

    SELECT '1001' user_id, 'USD' org, 200 en_qty, 30000 en_amt, 230 fi_qty, 30300 fi_amt, 270 sv_qty, 30700 sv_amt FROM dual UNION ALL

    SELECT '1002' user_id, 'GWR' org, 300 en_qty, 35000 en_amt, 330 fi_qty, 35300 fi_amt, 370 sv_qty, 35700 sv_amt FROM dual UNION ALL

    SELECT '1003' user_id, 'GGA' org, 400 en_qty, 40000 en_amt, 430 fi_qty, 40300 fi_amt, 470 sv_qty, 40700 sv_amt FROM dual UNION ALL

    SELECT '1003' user_id, 'GCA' org, 500 en_qty, 45000 en_amt, 530 fi_qty, 45300 fi_amt, 570 sv_qty, 45700 sv_amt FROM dual 

)

SELECT *

FROM   wdata

UNPIVOT 

(

    (qyt, amt) /* multi column */

    FOR lang

    IN 

    (

        (en_qty, en_amt) AS 'EN' 

      , (fi_qty, fi_amt) AS 'FI'

      , (sv_qty, sv_amt) AS 'SV'

    )

);