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

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

#7:集約によってグループを要約化する

 データのグループ化によってデータの分析は行いやすくなるが、ときには単なるグループそのもの以外の情報をもう少し欲しいこともあるだろう。集約関数を追加すると、グループ化されたデータをさらに要約化することが可能になる。たとえば、以下のステートメントではそれぞれの注文について小計を表示する。

SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY OrderID

 ほかのグループと同様に、SELECTとGROUP BYのリストは一致させなければならない。ただし、SELECTで集約を行う場合だけは、ルールの例外なのである。

#8:集約されたデータを要約化する

 それぞれのグループについて小計を表示することで、さらに要約化を行うことが可能である。SQLのROLLUP演算子を用いると、レコードが一つ余分に表示され、それぞれのグループに関する小計がそこに出力される。余分に表示されたレコードは、集約関数を用いてそれぞれのグループに含まれているレコードをすべて評価した結果となる。以下のステートメントでは、それぞれのグループについて合計を行い、OrderTotalカラムに出力している。

SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP

 たとえば、あるグループが2つの行からなっており、それぞれのOrderTotalの値が20、25だとすると、ROLLUPの行にはOrderTotalとして45が表示される。ROLLUPの結果に含まれる最初のレコードは、すべてのグループのレコードが評価されるためユニークな値となる。その値は、レコードセット全体の総計なのだ。

 ROLLUPでは、集約関数内でのDISTINCTの使用や、GROUP BY ALL節の使用はサポートされていない。

#9:それぞれのカラムを要約化する

 CUBE演算子はROLLUPよりもさらに一歩進んでおり、それぞれのグループに含まれているそれぞれの値の合計値を返すことができる。CUBEの結果はROLLUPと似ているが、CUBEではグループ内のそれぞれのカラムにレコードが追加されるのである。以下のステートメントでは、それぞれのグループの小計と共に、それぞれの顧客ごとの合計を追加で表示する。

SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH CUBE

 CUBEでは最も総合的な要約化がなされる。CUBEは集約とROLLUPの役割を果たすだけでなく、グループを定義する他のカラムも評価するのである。つまり、CUBEは可能なカラムの組み合わせすべてを要約化するのだ。

 CUBEでは、GROUP BY ALLはサポートされていない。

#10:要約に順番を定める

 (普通そうなのだが)CUBEを使用した結果が混乱を招くようであれば、次のようにGROUPING関数を追加するとよい。

SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH CUBE

 GROUPING関数を追加すると、結果のレコードそれぞれに2値のカラムが追加される。

  • 値が1の場合は、左側の値が要約値である、つまりROLLUPもしくはCUBE演算子を使用した結果である、ということを示す。
  • 値が0の場合は、左側の値がオリジナルのGROUP BY節で作成された詳細を表すレコードだということを示す。
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]