メタボン皆様、ごぶさたしています。久しぶりの登場となりますがはりきっていきましょう。11gで追加された機能の中でも、大々的には取り上げられてはないけど開発者や管理者にとってかゆいところに手が届く機能をピックアップしてその機能を検証しています。先週は開発者にとっても有益なPIVOT関数について取り上げてみました。第2回目は、こちらも便利なUNPIVOT関数について検証をしてみたいと思います。Production■UNPIVOTとは?前回はOracle11gから追加された関数PIVOT関数をご紹介しました。PIVOTについては動作がイメージしやすいと思いますが、UNPIVOTについては皆様いかがでしょうか。簡単に説明をしてしまうと、クロス集計されているような複数の値列を単一の列に変更してくれる関数です。前回の検証でピボット化したテーブルを参考にUNPIVOT関数がどのような動きをするのか確認していくことにしましょう。■通常のSQLとUNPIVOT関数を使用したSQLさて、まずはこのデータを前回同様JOBとDNAMEごとに集計した結果を確認しておきます。5600前回はこの結果をクロス集計データにピボット化しましたがこれを表として作成、保存しておきます。56003)の表について自前のSQLでUNPIVOTを行うのであれば以下のSQLで実行が可能です。※UNPIVOTは1)で確認したクロス集計する前の集計イメージへ再構築します。560015行が選択されました。このように、複数列の値をJOBという単一の列として再構築できました。allで各カラム分のSQLを記述する必要があります。UNPIVOT関数を実行してみます。同様の結果を得ることができました。nulls”と記述します。これにより、SUM_SALの値がNULLのものを除外して抽出します。■UNPIVOT関数の内部SQLとは?UNPIVOT関数は、内部的にどのような処理をしているのでしょうか。PIVOT関数同様に確認することにしましょう。いうことで、まずはお馴染みのSQLトレースを取得して確認してみることにしましょう。card=3)今回もUNPIVOTというオペレーションが実行されている事は実行計画から確認できましたが、どのようなSQLが実行されているかまでは確認できません。内部ではどのようなSQL文が実行されているのか確認してみましょう。以下のSQL文を実行します。"from$_subquery$_002"ふーむ、4)で作成したSQL文と同様のものが実行されてるようです。指定カラム数が多い場合は、安易にUNPIVOT関数を実行してしまうと負荷が気になりますね。SCANがPIVOT表に対して5回実行されます。ALLを使用した形でSQLを再構築し、展開されていることが確認できます。簡単に要求を実現できる機能としては待ち望まれていたものかもしれませんね。いう自分も、以前はプログラムで問い合わせ結果を一度配列に格納し、、、再構築。SQLを駆使してクロス集計を行っていた口であります。確認などもお手軽に実行できますよね。以上、2回にわたり分析関数PIVOT、UNPIVOTについて検証してきました。次回は仮想列について検証を行う予定です。お楽しみに!!では、またお会いする日まで。reserved.トップページ企業概要プライバシーポリシ。