SQLデータをソート、グループ化、要約化するための10 Tips

文:Susan Harkins(TechRepublic) 翻訳校正:原井彰弘
2007-12-25 10:06:01
  • このエントリーをはてなブックマークに追加

#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を評価する。
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]