SQLクエリでデータを範囲でグループ化する方法に関するSOに関する多くの質問を見てきました。
GROUP BY
正確なシナリオはさまざまですが、それぞれの一般的な根本的な問題は、列内の個々の値ではなく、値の範囲でグループ化することです。つまり、データベース テーブルに格納しているよりも精度の低い粒度でグループ化することです。
これは、ヒストグラム、カレンダー表現、ピボット テーブル、その他の特注のレポート出力などを生成するときに、現実の世界で頻繁に発生します。
いくつかのサンプルデータ (無関係なテーブル):
| OrderHistory | | Staff |
--------------------------- ------------------------
| Date | Quantity | | Age | Name |
--------------------------- ------------------------
|01-Jul-2012 | 2 | | 19 | Barry |
|02-Jul-2012 | 5 | | 53 | Nigel |
|08-Jul-2012 | 1 | | 29 | Donna |
|10-Jul-2012 | 3 | | 26 | James |
|14-Jul-2012 | 4 | | 44 | Helen |
|17-Jul-2012 | 2 | | 49 | Wendy |
|28-Jul-2012 | 6 | | 62 | Terry |
--------------------------- ------------------------
ここDate
で、テーブルの列を使用してOrderHistory
、週ごと、つまり 7 日間の範囲でグループ化するとします。Staff
または、 10 歳の範囲にグループ化することもできます。
| Week | QtyCount | | AgeGroup | NameCount |
-------------------------------- -------------------------
|01-Jul to 07-Jul | 7 | | 10-19 | 1 |
|08-Jul to 14-Jul | 8 | | 20-29 | 2 |
|15-Jul to 21-Jul | 2 | | 30-39 | 0 |
|22-Jul to 28-Jul | 6 | | 40-49 | 2 |
-------------------------------- | 50-59 | 1 |
| 60-69 | 1 |
-------------------------
GROUP BY Date
そしてGROUP BY Age
、それを自分で行うことはありません。
私が見る最も一般的な答え (どれも一貫して「正しい」と投票されていません) は、次の 1 つ以上を使用することです。
CASE
ステートメントの束、グループごとに 1 つ- グループごとに異なる句を使用した一連の
UNION
クエリWHERE
- 私はSQL Serverを扱っているので
PIVOT()
、UNPIVOT()
- サブセレクト、一時テーブル、またはビュー構造を使用した 2 段階のクエリ
そのようなクエリを処理するための確立された一般的なパターンはありますか?