このシリーズ記事のパート11 "分析関数:ランキング、LEAD/LAG、レポート"(Oracle Magazine、2013年5/6月)では、パート10で始まった分析関数の説明の続編をお届けしました。上位N番までの問合せの結果を取得する、データの比較を評価する、グループ内の割合を計算するといったさまざまな操作が可能になる分析関数の例を示しました。この記事では、分析関数シリーズの最後の話題として、次の点を取り上げます。, このシリーズ記事の例を試すには、Oracle Databaseインスタンスにアクセスする必要があります。必要に応じて、お使いのオペレーティング・システムに対応したOracle Databaseエディションをダウンロードし、インストールしてください。筆者がインストールをお勧めするエディションは、Oracle Database, Express Edition 11g Release 2です。このOracle Databaseソフトウェアをインストールする場合は、データベースの作成と構成が可能なインストール・オプションを選択してください。サンプルのユーザー・アカウントと関連する新しいスキーマを含む新しいデータベースが作成されます(SQL_101は、このシリーズ記事の例で使用するユーザー・アカウントです。また、データベースの表やその他のオブジェクトが作成されるスキーマでもあります)。インストール・プロセスの実行中にスキーマのパスワードを指定するように求められたら、SYSおよびSYSTEMのパスワードを入力して確認し、そのパスワードを覚えておいてください。, 最後に、このデータベース・ソフトウェアをゼロからインストールした場合でも、既存のOracle Databaseインスタンスにアクセスする場合でも、SQLスクリプトをダウンロードして解凍し、実行して、この記事の例で必要となるSQL_101スキーマ用の表を作成します(このスクリプトをテキスト・エディタで開き、実行方法の説明を確認してください)。, よくある業務レポート要件として、レポートを読みやすくするために、列内のデータを垂直ではなく水平に表示するというものがあります。たとえば、リスト1とリスト2の結果セットを比較してみましょう。リスト1の問合せでは、すべての従業員を所属する部門IDと並べて表示し、部門と従業員名でソートします。リスト2で返されるデータはリスト1で返されるデータと同じですが、表示方法が異なります。, リスト2ではLISTAGG関数(Oracle Database 11gで導入された関数)を使用して、部門ごとにカンマ区切りの従業員リストを作成し、リスト1のような従来型の結果セットの表示をピボット(変換)しています。LISTAGGは、単一グループの集計関数、複数グループの集計関数、分析関数のいずれでも使用可能です。, LISTAGGを単一グループの集計関数として呼び出した場合は、他の単一グループの集計関数と同様に、WHERE句の条件を満たすすべての行に基づいて動作した上で、単一行の出力を返します。リスト2の例は、複数グループの集計関数としてのLISTAGG使用例です。GROUP BY句によって定義されたグループごとに行を返しています。, 集計対象の列または式とWITHIN GROUPキーワードを記述し、各WITHIN GROUPキーワードの直後にORDER BY句(グループ内でのソート方法)を記述することが、LISTAGGの3種類のユースケースすべてで必須です。, リスト3の問合せでは、LISTAGGを分析関数として使用します。この問合せでは、部門ごとに、金額が高い順に給与のリストを取得します。各SALARY値の横には、そのSALARY値を得た従業員名を姓/名のアルファベット順で表示します。さらに、現在の行で示す部門に所属するすべての従業員が、給与の高い順、姓/名のアルファベット順で返されます。, PIVOT句を使用すれば、行を列に変換して、データをクロス集計形式で表示できます。PIVOT句の構文は次のとおりです。, リスト4とリスト5の結果セットを比較しましょう。リスト4の問合せは、各部門の従業員給与総額のサマリーをクロス集計レポート形式で表示します。リスト5の問合せは、リスト4と同じ部門ごとの給与サマリーを返しますが、縦欄式に表示しており、ユーザーにとっては読みづらい可能性があります。, リスト6の問合せは、複数の列に基づいてピボットできることを示しています。この問合せの結果には、部門ごとの給与総額が表示されますが、特定の年に雇用された従業員のみのデータが含まれます。また、リスト7のように、複数の集計値に基づいてピボットして表示することもできます。リスト7の問合せでは、部門ごとの給与総額と最新の従業員雇用日を並べて取得しています。, 複数の集計関数を使用する場合には、各集計関数に対して別名を指定することをお勧めします。出力される列ヘッダーはピボット値(またはピボットの別名)、アンダースコア、そして集計関数の別名(指定した場合)を連結したものになります。たとえば、リスト7の列名は、10_SALS、10_LATESTなどとなっています。部門ごとの最新の雇用日に関する列(10_LATESTなど)は、実際にはLATEST_HIREという別名を使用した列です。LATEST_HIREという別名の前に部門IDを付加した場合、本来は問合せで10_LATEST_HIREのような列が返されるはずです。, しかし、SQL*Plusでは、DATEデータ型の列に対して表示される列ヘッダーは、返される値のデフォルト書式よりも常に短くなります。HIRE_DATE列の書式はDD-MON-RRであるため、ヘッダーの先頭から9文字のみが表示されます。10_LATEST_HIREのようにヘッダー全体を表示するには、TO_CHARを使用して列に日付書式マスクを適用することを検討してください。, 集計関数に対して別名を指定しない場合、リスト8の例のように、エラー・メッセージが表示されることがあります。リスト8では、いずれの集計関数にも別名が指定されていないため、PIVOT演算子でピボット値(例の場合はDEPARTMENT_ID値)の列ヘッダーをどちらに適用すべきかを判断できません。そのため、PIVOT演算子で単純にデフォルトの列ヘッダーを使用できず、"column ambiguously defined"というエラー・メッセージが表示されて問合せが失敗します。このエラーを回避するには、各集計関数に対して別名を作成します。PIVOT操作を利用する際には、デフォルトの列ヘッダーだけに頼らないようにしてください。, コード・リスト8:"column ambiguously defined"エラーの発生, レポートの行を列に変換する必要があるのと同様に、列を行に変換する必要がある場合もあります。これまで、LISTAGG関数を使用した方法を確認しました。そのほかにも、UNPIVOT演算子をこの目的で使用することができます。注意点として、UNPIVOT演算子は、PIVOT演算子によって実行される操作と逆の操作を実行するわけではありません。むしろ、ピボット済みとしてすでに保管されているデータに対して動作します。, リスト9のCREATE TABLE文を見てみましょう。この文は、リスト7と同様の問合せを使用して、ピボット後のデータを含む表を作成します。この後、リスト10のようにUNPIVOT演算子を使用して、このデータを問い合わせることができます。リスト10の問合せにより返される値と、リスト7の問合せにより返される値を比較してみてください。見てのとおり、値は同じですが表示方法が異なります。, リスト7の結果は長い1つのレコード(1行)で返され、HIRE_DATEとSALARYがそれぞれ組み合わされて、部門ごとにピボットされた上で、横並びで表示されました。一方、リスト10の問合せでは、これらの組合せのそれぞれが重複のない個別の行として返され、HIRE_DATE値とSALARY値が別々の列に表示されます。リスト10の問合せでは異なるデータ型の値のペアがアンピボットされて返されている点に注意してください。HIRE_DATEではDATEデータ型を、SALARYではNUMBERデータ型を使用します。そのため、これらの値のペアに対して使用する別名は、一重引用符で囲む必要があります。一重引用符で囲まなければ、リスト11に示すようなエラー・メッセージが表示されます。, 最後のORDER BY句を除けば、分析関数は、問合せで実行される最後の操作セットです。SELECT構文のリストとORDER BY句でしか記述できないため、WHERE句やHAVING句などの条件内で直接使用することはできません。分析関数を適用した結果に基づく結果セットから選択操作を行う必要がある場合は、インライン・ビューを使用できます。インライン・ビューとは、別のSELECT文のFROM句内にあるSELECT文のことです。インライン・ビューは、TABLE(別名FROM)句のように振る舞います。インライン・ビュー機能の例については、すでにこの記事のリスト4、6、7、8、9で確認しました。, 分析関数を使用して、部門ごとに上位給与取得者者2人を取得することにしましょう。その場合、リスト12に示すように、インライン・ビュー内に分析関数操作を配置して別名を付けることができます。リスト12のインライン・ビューに指定された別名はD_RANKです(DENSE_RANK分析関数の適用結果という意味で名付けられています)。インライン・ビュー内の問合せ(内部問合せ)が解決されるまでは、それを取り囲む問合せ(外部問合せ)で使用できません。インライン・ビューの処理が完了後、外部問合せの条件内でその結果を使用できます。リスト12の外部問合せ内の条件句は次のようになります。, 分析関数は、レポート要件に対して、より洗練されたパフォーマンスの良いSQLの解を作成するのに役立ちますが、良いコードを記述することの代わりになるものではありません。保守しやすく、長期にわたって良いパフォーマンスを発揮するような良いSQLを、常に一貫して記述することを目標にすべきです。処理を容易にするSQLテクニックを誤用することはよくあります。正しく使用しなければ、SQLテクニックは稚拙な書き方になり、システムの阻害要因になるのです。, 特に、データのソートや移動によりシステム・リソースを使い果たすこともよくあります(たとえば、リスト13の問合せには、可能性として3回のソート操作が含まれます)。このことにより、かならずしも分析関数の利用をやめるべきだということにはなりません。しかし、効率的で洗練され、保守しやすい解をもたらす問合せを記述するのと同じくらい簡単に、システムをダウンさせるような問合せを記述する可能性があるということに注意してください。分析関数の力を利用するには、責任も伴います。, コード・リスト13:システムのパフォーマンス問題を引き起こす可能性のある分析関数を含む問合せ, Oracle Database Concepts 11g Release 2 (11.2), Oracle Database SQL言語リファレンス11g リリース1(11.1), Oracle Databaseデータ・ウェアハウス・ガイド11gリリース2(11.2), この記事では、このシリーズのパート10とパート11で紹介した分析関数について最後の話題を取り上げました。LISTAGG、PIVOT、UNPIVOTを使用してデータの表示方法を操作する例を示しました。列を行に変換する方法や行を列に変換する方法、それらの表示方法の違いについて確認しました。個々のデータ項目を取得して、デリミタ付きリストとして返すことで、読みやすいレポートを作成する方法を学習しました。さらに、これらの関数を使用する場合に適用される固有の注意事項についても確認しました。, 最後に重要なこととして、分析関数を使用する問合せは、気をつけなければ、すべてとは言わないまでも大量のシステム・リソースを消費するということを学習しました。すべてのケースで、分析関数を利用することで、同じ結果を取得するために複雑なSQLを記述しなければならない状況が大幅に減ることになるでしょう。しかし同時に、分析関数は、熱中しながらも警戒も怠らないようにする必要のあるツールなのです。詳しくは、Oracle Database SQL言語リファレンスとOracle Databaseデータ・ウェアハウス・ガイドを確認してください。, この記事で、SQLの基礎に関するシリーズ記事は終了です。これまで、リレーショナル・データベースの基本的な概念や多くのSQLコーディング構文を学習してきましたが、このシリーズ記事ではOracle SQLの豊富な機能の一部を垣間見たに過ぎません。今後も各種ドキュメントを確認し、Oracle Databaseの既存機能や新機能を試していってください。Oracle MagazineおよびSQLの基礎に関するシリーズ記事をお読みいただき、ありがとうございました。SQLの記述を続ける皆さんが、私と同じくらい楽しんでくれることを願います。, Melanie Caffreyはオラクルの上級開発マネージャーです。Expert PL/SQL Practices for Oracle Developers and DBAs(Apress、2011年)およびExpert Oracle Practices: Oracle Database Administration from the Oak Table(Apress、2010年)の共著者でもあります。, 入力したキーワードの同義語を使用してください。たとえば、「ソフトウェア」の代わりに「アプリケーション」を試してみてください。. この章では、アプリケーションに柔軟性と機能性を持たせる高度なプログラミング技法であるOracle動的SQLの使用方法について説明します。SQL文を実行時に受け入れて処理するプログラムについて、4つの作成方法を紹介します。
Change 最終回 漫画 4, ビル 鳥 衝突 4, エクセル 年末 日付 9, Mac 音量 表示 消す 4, ドラえもん 映画 日本誕生 フル 6, Ipad Mini 手書き 7, 防衛大学校 女子 生活 7, 新年 ドラマ 再放送 8, Dmr Bzt860 Hdd換装 10, Galaxy S10 手書き入力 5, 一次反応 半減期 初濃度 18, すのこベッド Diy おしゃれ 5, リンナイ湯沸かし器 緑点滅 解除 19, パズドラ 裏列界 遊戯 4, Minecraft Addons Bedrock 45, Ktm フリー ライド 耐久性 5, Access Powerpoint 連携 4, Converse Usa Ct70 9, マイン クラフト Wiiu エンダードラゴン 孵化 14, 営業 接待 多い業界 12, Aquos R2 Sdカード 4, 連絡帳の 書き方 例文 11, 肉味噌 じゃがいも グラタン 4, フォーン端子 変換 Usb 4, 虜 歌詞 Ytr 8, 乳癌 皮膚転移 どんな臭い 4, アイランド やま が み 2ch 5, Are You Alright 返事 5, マツダ Cx30 最新情報 6, Pubg 足音 大きく 8, V40 D4 故障 13, Adobe Hosts 2019 40, Huawei P10 Lite 分解 5, Welcart Pay Jp 25, ニュース テロップ ソフト 4, Akg K812 Lemo 9, 子犬 留守番 うんちまみれ 4, Pdf 文字 情報 削除 4, 家紋 花びら 5枚 5, 間仕切り壁 Diy 材料 10, 送別会 英語 歌 4, 顔 エラ ぶつぶつ 9, バケット 爪 サイズ 12, エクセル パーセント 表示しない 12, 我 が闘争 ネタ 4, デミオ 15s 燃費 8, プレドニゾロン ジェネリック 通販 7, Don't Do That 意味 19, Nec マウス Amazon 5, 足 小指 副爪 抜く 4, Z会 東大 合格者 4, ギャラクシー S9 電話帳 登録 4, カッコイイ 名言 漫画 13, Galaxy S20 イヤホン 届かない 8, 奨学金 給与明細 ない 20, ドラフト候補 社会人 投手 30, 宇佐美 バッテリー交換 評判 6, 新宿スワン 無料 漫画 36巻 9, 占い 当たらない 四柱推命 15, 東京グール トーカ 死亡 12, 動画 著作権 キャラクター 4, Jr Web 説明会 4, 鬼滅の刃 るろうに剣心 比較 11, ボルボ V40 エンジン音 14, Google 混雑状況 Api 14, ギター 初心者 ストローク 13, 職場 紹介 パワーポイント 4, 離婚 話し合い 進まない 7, Dior 下地 崩れない 7, 藤浪 パワプロ 全盛期 21, アン ギルバート ラブラブ 28, 水道管 鉄管 サイズ 9, マニキュア 捨て方 足立区 5, セルラン 推移 Fgo 10, 心理学 大学院 ランキング 12, Ff14 シーズナルショップ 2020 4, Opencv Skeleton Tracking Python 5, 安住紳一郎 父親 砂糖 46, スズキ Cvt ジャダー 11,