ここはとある街の総合病院。
ここには通常の診療科のほかに,一風変わった診療科が存在する。
何軒もの病院をたらいまわしにされた,手の施しようのない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のようになる。



