SQLデータをソート、グループ化、要約化するための10 Tips
翻訳校正:原井彰弘
データを分析するためにどのようなSQLを構築すればよいか、10個のTipsを紹介する。
#4:すべてのグループを返す
データのフィルタリングにWHEREを用いる場合、結果のグループでは指定したレコードのみが表示される。グループの定義には当てはまるものの、WHERE節の条件には合致しないデータは、グループには含まれないのである。ところが、ここでALLと記述すると、WHEREの条件にかかわらずすべてのデータを含めることができるようになる。たとえば、先ほどのステートメントにALLを追加すると、ケンタッキー州以外のZIPコードのグループもすべて返されるようになる。
SELECT ZIP FROM Customers WHERE State = 'KY' GROUP BY ALL ZIP
この状態では、2つの節が矛盾している。このようなALLの使い方は普通はしないのである。ALLが便利なのは、集約関数を用いてカラムを評価する場合だ。たとえば以下のステートメントでは、ケンタッキー州についてはそれぞれのZIPコードに対応する顧客数をカウントし、それ以外の州についてはZIPコードの値のみを表示する。
SELECT ZIP, Count(ZIP) AS KYCustomersByZIP FROM Customers WHERE State = 'KY' GROUP BY ALL ZIP
結果のグループは、データに含まれているすべてのZIPコードの値が含まれている。しかし、ケンタッキー州以外のZIPコードでは、集約カラム(KYCustomersByZIP)には0の値が表示される。
GROUP BY ALLはリモートクエリではサポートされていない。
#5: グループ化の後にデータを限定する
WHERE節(#3)では、GROUP BY節が実行される前にデータが評価されたが、もしグループ化の後にデータを限定したい場合は、HAVINGを用いればよい。ときにはWHEREを用いてもHAVINGを用いても結果が変わらない場合もあるが、これらの節は代替可能ではないので注意して欲しい。よく分からなくなったときのために、ガイドラインを用意した。「レコードのフィルタリングにはWHEREを使え。グループのフィルタリングにはHAVINGを使え」である。
普通、HAVINGでは集約関数を用いてグループを評価する。たとえば、以下のステートメントではZIPコードのユニークなリストを返すが、リストにはもともとのデータに含まれていたZIPコードすべてが含まれるわけではない。
SELECT ZIP, Count(ZIP) AS CustomersByZIP FROM Customers GROUP BY ZIP HAVING Count(ZIP) = 1
このステートメントでは、顧客が一人のみのグループだけが結果に含まれるのである。
#6:さらにWHEREとHAVINGについて
WHEREとHAVINGの使い分けについてまだ混乱しているなら、次のガイドラインを適用しよう。
- WHEREはGROUP BYの前に記述する。従って、SQLはグループ化の前にWHEREを評価する。
- HAVINGはGROUP BYの後に記述する。従って、SQLはグループ化の後にHAVINGを評価する。
- 6人の推薦記事
- 1人がクリップ
-
ソーシャルブックマーク(-)
- トラックバック(5)
- 2日前のトップ記事
- 3日前
- 4日前
- 5日前
- 6日前
- ホワイトペーパー
- 話題のタグ
動画再生耐久レース―フル充電からどれだけ耐えた?
心当たりありませんか--あなたの上司がイヤがる5つの話し方
フォームデザイン虎の巻:複数の選択肢を提供する
フォトレポート:技術サポートの悪夢
無料の「Oracle Database XE」で高速バッチ処理:実装のポイント
Firefoxで情報をカンタン・ベンリに整理する
iPhone Safari、Acidテストでは高得点でも…… Firefoxは載らないの?:WebサイトのiPhone 3G対応問題を考える(ソフト編)
WebサイトのiPhone 3G対応問題を考える(ハード編)
フォトレポート:時代を振り返る--「MS-DOS 4」のインストール
SOAと仮想化の関係は?--常に進化を続けるBEAのミドルウェア戦略
ウェブ開発の生産性はどうしたら上がる?--MODIPHI Appsで半日で作るマッシュアップサイト(1)
JailBreakついに:PwnageTool公開
プロジェクトの進行でよくある4つのトラブル
Techno Exchange
DELLが掲げる「新・仮想化アセスメントサービス」
ZDNet Japan ホスティング特集
ZDNet Japan Green IT