Oracle Database の PIVOT文で取得レコードの縦横を変換する。

PIVOT文で取得レコードの縦持ち／横持ちを変換するやで彡(ﾟ)(ﾟ)
このSQLで取得できる……

```sql
COLUMN TARGET_NAME FORMAT A8;
COLUMN TARGET_TYPE FORMAT A15;
  SELECT TARGET_NAME
       , TARGET_TYPE
       , AVAILABILITY_STATUS                            AS AVAILABILITY_STATUS
       , ROUND(SUM(END_TIMESTAMP - START_TIMESTAMP), 2) AS DAYS
    FROM MGMT$AVAILABILITY_HISTORY
   WHERE TARGET_TYPE IN ('oracle_database', 'rac_database')
     AND TARGET_NAME IN ('REPO', 'orclk')
     AND START_TIMESTAMP >= (SYSTIMESTAMP-365)
   GROUP BY TARGET_NAME, TARGET_TYPE, AVAILABILITY_STATUS
   ORDER BY TARGET_NAME, TARGET_TYPE, AVAILABILITY_STATUS;

TARGET_N TARGET_TYPE     AVAILABILITY_ST       DAYS
-------- --------------- --------------- ----------
REPO     oracle_database Agent Down            2.67
REPO     oracle_database Blackout               .01
REPO     oracle_database Pending/Unknown          0
REPO     oracle_database Target Down            .24
REPO     oracle_database Target Up           345.32
REPO     oracle_database Unreachable               
orclk    rac_database    Metric Error             0
orclk    rac_database    Pending/Unknown      34.34
orclk    rac_database    Target Down           6.45
orclk    rac_database    Target Up           222.98
orclk    rac_database    Unreachable               

11行選択されました
```
この結果を…
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/ebffd9fb-7d03-d89b-a7a5-d60f236a289c.jpeg)

↓のようにしたい。
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/6017ee0b-e16b-37f4-85bc-79c4bc89c5f6.jpeg)

PIVOT文を使うやで彡(ﾟ)(ﾟ) サンプルは下記

```sql
COLUMN TARGET_NAME FORMAT A8;
COLUMN TARGET_TYPE FORMAT A15;
COLUMN AgentDown FORMAT 999.99;
COLUMN Blackout FORMAT 999.99;
COLUMN Pending_Unknown FORMAT 999.99;
COLUMN TargetDown FORMAT 999.99;
COLUMN TargetUp FORMAT 999.99;
COLUMN MetricError FORMAT 999.99;
COLUMN Unreachable FORMAT 999.99;
SELECT * FROM (
  SELECT TARGET_NAME
       , TARGET_TYPE
       , AVAILABILITY_STATUS                            AS AVAILABILITY_STATUS
       , ROUND(SUM(END_TIMESTAMP - START_TIMESTAMP), 2) AS DAYS
    FROM MGMT$AVAILABILITY_HISTORY
   WHERE TARGET_TYPE IN ('oracle_database', 'rac_database')
     AND TARGET_NAME IN ('REPO', 'orclk')
     AND START_TIMESTAMP >= (SYSTIMESTAMP-365)
   GROUP BY TARGET_NAME, TARGET_TYPE, AVAILABILITY_STATUS
)
PIVOT (
  MAX(DAYS) FOR AVAILABILITY_STATUS IN (
      'Agent Down'      AS AgentDown
    , 'Blackout'        AS Blackout
    , 'Pending/Unknown' AS Pending_Unknown
    , 'Target Down'     AS TargetDown
    , 'Target Up'       AS TargetUp
    , 'Metric Error'    AS MetricError
    , 'Unreachable'     AS Unreachable
  )
)
ORDER BY TARGET_TYPE, TARGET_NAME;

TARGET_N TARGET_TYPE     AGENTDOWN BLACKOUT PENDING_UNKNOWN TARGETDOWN TARGETUP METRICERROR UNREACHABLE
-------- --------------- --------- -------- --------------- ---------- -------- ----------- -----------
REPO     oracle_database      2.67      .01             .00        .24   345.32                        
orclk    rac_database                                 34.34       6.45   222.98         .00            
```

上手くいってるやね彡(^)(^) ポイントは……

- PIVOT文の最初の「(」の直後は集約関数(MIN, MAX, SUM等) ※この例ではMAXを指定
- 列名にしたい列値を持っているカラムを FOR の後に指定 ※この例では AVAILABILITY_STATUS列を指定
- IN には 列値⇒列名 に 変換したいリテラル文字を指定 ※列値には何が返ってくるか、予め知っておく必要がある。あるいは最初のSQLのWHERE句で取得する値を明示的に指定する。

てなとこやろうか。マニュアルは下記やで彡(ﾟ)(ﾟ)

- Oracle Database SQL言語リファレンス
12cリリース1 (12.1) B71278-10
SELECT
pivot_clause
http://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_10002.htm#CHDCEJJE

- Oracle Database SQL言語リファレンス
12cリリース1 (12.1) B71278-10
SELECT
PIVOTおよびUNPIVOTの使用例
http://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_10002.htm#CHDFIIDD

下記の記事も参考にしています。
いつも参考にさせて頂いております(｀･ω･)ゞ

- 図でイメージするOracle DatabaseのSQL全集
第8回 PivotとUnPivot
OracleのSQLの各機能をイメージを交えて解説
http://www.oracle.com/technetwork/jp/articles/otnj-sql-image8-1869298-ja.html