Я видел много вопросов по 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
для каждой группыPIVOT()
иUNPIVOT()
Существует ли установленный общий шаблон для обработки таких запросов?