我在 SO 上看到了很多关于如何在 SQL 查询中按范围对数据进行分组的问题。
确切的场景各不相同,但每个场景中的一般潜在问题是按一系列值而不是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
他们自己不会这样做。
我看到的最常见的答案(没有一个始终被评为“正确”)是使用以下一个或多个:
- 一堆
CASE
语句,每个分组一个 - 一堆
UNION
查询,WHERE
每个分组有不同的子句 - 因为我正在使用 SQL Server,
PIVOT()
并且UNPIVOT()
- 使用子选择、临时表或视图构造的两阶段查询
是否有处理此类查询的既定通用模式?