Вместо того, чтобы распространять жестко закодированные операторы CASE, я бы предложил вам создать классификационную таблицу, к которой затем можно присоединиться, основываясь на сумме претензий, а затем сгруппировать заявки по каждой группе, т.е.
CREATE TABLE ClaimBand
(
Name NVARCHAR(20),
MinAmount NUMERIC(10,2),
MaxAmount NUMERIC(10,2),
);
INSERT INTO ClaimBand(Name, MinAmount, MaxAmount) VALUES
('Small Claims', 0, 1000),
('Medium Claims', 1000, 5000),
('Large Claims', 5000, 10000),
('Super Large Claims', 10000, 999999);
Теперь вы можете использовать управляемый данными подход, объединив утверждения в таблицу ClaimBand
, чтобы классифицировать утверждения на основе строк в ClaimBand
, а не кода:
SELECT band.Name, band.MinAmount, band.MaxAmount,
COUNT(*) AS NumClaims, SUM(c.Amount) AS TotalClaimed
FROM Claim c
INNER JOIN ClaimBand band on c.Amount >= band.MinAmount and c.Amount < band.MaxAmount
GROUP BY band.Name, band.MinAmount, band.MaxAmount;
Пример SqlFiddle здесь
Примечания
- Вы должны быть немного осторожнее с краями таблицы классификации - в примере здесь,нижняя граница является включающей, но верхняя граница является исключительной.
- Вы также можете, например, использовать
NULL
, чтобы указать, что нет верхней или нижней полосы, а затем настроить запрос соответствующим образом. - Вам нужно будет убедиться, что ваши группы не пересекаются друг с другом, в противном случае одно и то же утверждение будет классифицировано в нескольких диапазонах.