Я бы вел таблицу диапазонов, например (индексы не написаны)
CREATE TABLE Ranges (RangeSet int, MinVal int, MaxVal int, Name varchar(50));
, а затем, например,
INSERT INTO ranges VALUES
(1,1,5,'1-5'),(1,6,10,'6-10'),(1,11,-1,'11+'),
(2,1,10,'1-10'),(2,11,20,'11-20'),(2,21,30,'21-30'),(2,31,-1,'31+');
Вы поняли идею. Теперь вы делаете что-то вроде (имена таблиц и полей без художественной литературы)
SELECT
CustomerID,
count(OrderID) AS OrderCount
FROM Orders
WHERE <whatever, e.g order_date BETWEEN ... AND ...>
GROUP BY CustomerID
HAVING OrderCount>0
как и следовало ожидать, но оберните его в суперзапрос, присоединяющийся к таблице Ranges
SELECT
BaseView.CustomerID as CustomerID,
Ranges.Name as OrderRange
FROM (
SELECT
CustomerID,
count(OrderID) AS OrderCount
FROM Orders
WHERE <whatever, e.g order_date BETWEEN ... AND ...>
GROUP BY CustomerID
HAVING OrderCount>0
) AS BaseView
INNER JOIN Ranges ON
Ranges.RangeSet=<id-of-required-rangeset>
AND BaseView.OrderCount>=Ranges.MinVal
AND (BaseView.OrderCount<=Ranges.MaxVal OR Ranges.MaxVal=-1)
ORDER BY RangeSet.MinVal DESC
;
Теперь вам нужно просто указать RangeSet, который вы хотите применить, возможно, создавая новый.
Отказ от ответственности: это убийца производительности