Можно ли повторить предложение where в выражении case, основанном на количестве переменных? - PullRequest
0 голосов
/ 08 июня 2018

В рамках моей работы мне необходимо создать профили урегулирования претензий.Вот краткое представление о моей работе.

Мы получаем данные о претензиях.Мне нужно создать отчет по профилям претензий, где мы упомянем диапазон суммы претензий и соответствующее количество претензий и общее возмещение в пределах диапазона.В качестве примера можно привести -

625 претензий на сумму от 0 до 1000 долл. США с общим возмещением в размере 510 тыс. Долл. США,
862 претензий на сумму от 1001 до 5000 долл. США с общей суммой возмещения в размере 3,01 млн. Долл. США,
334 претензий на сумму от 5001 до 10000 долл. США приобщая сумма возмещения $ 2,6 млн.

Всегда есть некоторые изменения в группе или даже количестве групп.Так что в следующий раз такой же диапазон может потребовать 6 полос, а не 3. Я автоматизировал почти всю остальную часть отчета.Но не в состоянии это сделать.Я мог бы создать процедуру, в которой я мог бы упомянуть количество требуемых полос и нижнюю / верхнюю границы полос.Но тогда это не полностью автоматизировано.Моя идея заключается в том, что я упоминаю в начале запроса количество полос и границ.После этого мне не нужно изменять какую-либо часть запроса.

Ниже приведены мои усилия

DECLARE @Range1 varchar(10)
DECLARE @Range2 varchar(10)
DECLARE @Range3 varchar(10)

SET @Range1 = '0'
SET @Range2 = '1000'
SET @Range3 = '5000'

   SELECT
   CASE WHEN ROUND(clmamt, 0) between ' + @Range1 + ' and ' + @Range2 + ' THEN ''1. $' + @Range1 + ' - $' + @Range2 + '''
        WHEN ROUND(clmamt, 0) between ' + @Range2 + ' and ' + @Range3 + ' THEN ''2. $' + @Range2 + ' - $' + @Range3 + '''
        WHEN ROUND(clmamt, 0) > ' + @Range3 + ' THEN ''3. > $' + @Range3 + '''
        ELSE ''ERROR'' END AS 'Range',
   SUM(clmamt) 'Total Reimbursement', COUNT(l.CLMID ) as 'Total Claims'

        from
   TableA l join
        (
         select CLMID, SUM(clm) 'clmamt' from TableAB
         group by CLMID
        )lc on l.CLMID = lc.CLMID join 
   TableB pt on l.ACCNTID = pt.ACCNTID join
   TableC pn on pt.GROUPID = pn.GROUPID
   where pt.GROUPID in (1,2)
   Group by        CASE WHEN ROUND(clmamt, 0) between 0 and 1000 THEN '1. $0- $1000'
                        WHEN ROUND(clmamt, 0) between 1001 and 5000 THEN '2. $1001- $5000'
                        WHEN ROUND(clmamt, 0) > 5001 THEN '3. > $5000'
                        ELSE 'ERROR' END

Если бы я мог сделать что-то, где я мог бы добавить переменную для обозначения количества полос и диапазонакаждая группа.И автоматически запрос добавляет количество предложений когда в операторе CASE, это будет здорово.

1 Ответ

0 голосов
/ 08 июня 2018

Вместо того, чтобы распространять жестко закодированные операторы 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, чтобы указать, что нет верхней или нижней полосы, а затем настроить запрос соответствующим образом.
  • Вам нужно будет убедиться, что ваши группы не пересекаются друг с другом, в противном случае одно и то же утверждение будет классифицировано в нескольких диапазонах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...