是否可以根据变量的数量在 case 语句中重复 when 子句?

Is it possible to repeat when clause in case statement based on number of variables?

作为我工作的一部分,我需要创建理赔档案。这是关于我的工作的快速想法。

我们收到索赔数据。我需要创建索赔概况报告,其中我们提到索赔金额的范围以及相应的索赔数量和范围内的总报销。这个例子可以是-

625 项 0 - 1000 美元的索赔,总赔偿额为 51 万美元,
862 次索赔 1001 - 5000 美元,总报销 301 万美元,
334 次索赔,金额为 5001 - 10000 美元,总赔偿额为 260 万美元。

波段甚至波段数量总是有一些变化。所以下次相同的范围可能需要 6 个波段,而不是 3 个。我已经自动化了报告的几乎所有其他部分。但无法做到这一点。我可以创建一个程序,在其中我可以提及所需的波段数和波段的 lower/upper 范围。但是它不是完全自动化的。我的想法是,我在查询的开头提到了波段数和边界。之后我不需要更改查询的任何部分。

下面是我的努力

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. [=10=]- 00'
                        WHEN ROUND(clmamt, 0) between 1001 and 5000 THEN '2. 01- 00'
                        WHEN ROUND(clmamt, 0) > 5001 THEN '3. > 00'
                        ELSE 'ERROR' END

如果我可以做一些事情,我可以添加一个变量来表示波段数和每个波段的范围。并且自动查询在CASE语句中添加when子句的个数,那就太棒了。

我建议您创建一个分类 table,而不是激增硬编码的 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 table 来使用数据驱动方法,以根据 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 example here

备注

  • 您需要注意分类的边缘 table - 在此处的示例中,下限包含在内,但上限不包含在内。
  • 例如,您也可以使用 NULL 来指示没有上限或下限,然后相应地调整查询。
  • 您需要检查您的波段是否相互重叠,否则同一个声明将被归入多个波段。