PIVOT文で取得レコードの縦持ち/横持ちを変換するやで彡(゚)(゚)
この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行選択されました
PIVOT文を使うやで彡(゚)(゚) サンプルは下記
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