SQL緊急救命室

第3回 ループ依存症~手続き型の呪縛を打ち破れ!

この記事を読むのに必要な時間:およそ 10 分

ここはとある街の総合病院。

ここには通常の診療科のほかに,一風変わった診療科が存在する。

何軒もの病院をたらいまわしにされた,手の施しようのないSQLや,今すぐに改善が必要なSQLが担ぎ込まれる救命室である。

それがSQL緊急救命室,略してSER(SQL Emergency Room)⁠

そう,ここは国内でも唯一のプログラミング専門外来である。

ロバート
救命室部長。腕の立つエンジニアだが,口が悪く性格はもっと悪い四十オヤジ。

ヘレン
救命室副部長。若いながらもロバートに次ぐ実力を持つ才媛。救命室の良心。

ワイリー
インターンで救命室に配属された不運な学生。無給で治療から雑務全般にこき使われる。エンジニアとしては新人に毛が生えたレベル。

ループという病

SQLを学ぶ上で最も高いハードルとなるのが,順序と手続きではなく,集合と論理の観点から考えることだ。

J.Celko『Joe Celko's SQL Programming Style』
⁠Morgan Kaufmann,2005年)p.184

ループによる表現

(PM3:00 手術室。先ほどかつぎ込まれたばかりの患者を前にして,何やら揉めている)

ワイリー,そこをどけ!


いーえ,どきません。僕は,どうしても今回の患者に治療が必要だとは思えないのです。先生は,健康な患者に,功名心のあまり必要のない治療をしようとしていませんか? 先生は切らなきゃ気がすまないんでしょう!

若僧が,きいた風な口を! いいからどけっ(ドンッ)


ああっ!(へなへなと崩れ落ちる)


ワイリー,喧嘩している時間はないわ。さっさと始めるわよ。


カルテ:図1のような2つのテーブルがあるとする。Salesテーブルは企業ごとの会計年ごとの売り上げを記録している。ただし年は連続しているとは限らない。このデータから,同じ企業についてある年とその直近の年の売り上げの変化を調べたい。

その結果を,var列を追加したSales2に登録する。var列の値は次のルールによって決められる。

  • より古い年のデータが存在しない場合:NULL
  • 直近の年のデータより売り上げが伸びた場合:+
  • 直近の年のデータより売り上げが減った場合:-
  • 直近の年のデータより売り上げと同じ場合:=

登録後のSales2テーブルは図2のようになる。

図1Sales,Sales2テーブル

図1 Sales,Sales2テーブル

図2 登録後のSales2テーブル

図2 登録後のSales2テーブル

著者プロフィール

ミック

SI企業に勤務するDBエンジニア。主にデータウェアハウス業務に従事している。自身のサイト「リレーショナル・データベースの世界」でデータベースとSQLについての技術情報を公開している。『Web+DB Press』で「SQL緊急救命室」を連載中。

著書:『SQL ゼロからはじめるデータベース操作』(翔泳社,2010)『達人に学ぶ SQL徹底指南書』(翔泳社,2008)訳書:J.セルコ『SQLパズル 第2版』(翔泳社,2007)

Twitter:copinemickmack

SQL緊急救命室:サポートページ

コメント

コメントの記入