从先前的 CASE 语句为 SQL 查询制作 CASE 语句

Making CASE statement from previous CASE statement for SQL Query

我目前正在使用 SQL Server 2012 并试图找出如何从 CASE 语句中获取结果。

所以目前我有一个 CASE 语句来计算我目前用来查找请求的商业年龄的 AgeBusiness 字段。这是我的代码:

CASE    WHEN A.[End_Date] > A.[Start_Date] THEN C2.[BUS_DY_OF_CAL_NUM] - C1.[BUS_DY_OF_CAL_NUM] 
        WHEN A.[End_Date] IS NULL and A.[Start_Date] IS NOT NULL THEN C3.[BUS_DY_OF_CAL_NUM] - C1.[BUS_DY_OF_CAL_NUM]
        WHEN A.[End_Date] = A.[Start_Date] THEN 1
END AS AgeBusiness

基本上,如果结束日期大于开始日期,则使用结束日期 - 开始日期来计算。 如果没有结束日期,则使用 GETDATE() - 开始日期来计算。 如果相等,则为 1 个工作日。

无论如何,我有这个 AgeBusiness 字段,我正在尝试使用这个字段或来自这个字段的数据来计算一个新的 Case When 语句来计算需求。

在理想情况下,我的 CASE 语句应该是这样的:

CASE WHEN AgeBusiness >= 0 AND AgeBusiness <11 AND Name = "RequirementA" Then 1 
     WHEN AgeBusiness >= 0 AND AgeBusiness <8 AND Name = "RequirementB" Then 1  
     WHEN AgeBusiness >= 0 AND AgeBusiness <181 AND Name = "RequirementC" Then 1
     WHEN AgeBusiness >= 0 AND AgeBusiness <8 AND Name = "RequirementD" Then 1
     WHEN AgeBusiness >= 0 AND AgeBusiness <11 AND Name = "RequirementE" Then 1
     WHEN AgeBusiness >= 0 AND AgeBusiness <16 AND Name = "RequirementF" Then 1
End AS WithinRequirements

基本上我想创建一个名为 Within Requirements 的新案例陈述,如果它在一定的天数内出现并且有一个特定的名称,那么它将是 yes 或在这种情况下 1. name 字段已经存在于我可以插入的 table。虽然制作 WithinRequirements 的要求之一要求 AgeBusiness 存在,但这些字段将在查询中同时创建……所以这是不可能的。

有没有办法使用我放在上面的 AgeBusiness 的信息以某种方式创建 WithinRequirements?目标是在查询中解决这个问题......即使这意味着冗长的查询。

对中间变量使用 CROSS APPLY

SELECT 
CASE WHEN AgeBusiness >= 0 AND AgeBusiness <11 AND Name = "RequirementA" Then 1 
     WHEN AgeBusiness >= 0 AND AgeBusiness <8 AND Name = "RequirementB" Then 1  
     WHEN AgeBusiness >= 0 AND AgeBusiness <181 AND Name = "RequirementC" Then 1
     WHEN AgeBusiness >= 0 AND AgeBusiness <8 AND Name = "RequirementD" Then 1
     WHEN AgeBusiness >= 0 AND AgeBusiness <11 AND Name = "RequirementE" Then 1
     WHEN AgeBusiness >= 0 AND AgeBusiness <16 AND Name = "RequirementF" Then 1
End AS WithinRequirements
FROM  A 
CROSS APPLY (
   SELECT CASE WHEN A.[End_Date] > A.[Start_Date] THEN C2.[BUS_DY_OF_CAL_NUM] - C1.[BUS_DY_OF_CAL_NUM] 
           WHEN A.[End_Date] IS NULL and A.[Start_Date] IS NOT NULL THEN C3.[BUS_DY_OF_CAL_NUM] - C1.[BUS_DY_OF_CAL_NUM]
           WHEN A.[End_Date] = A.[Start_Date] THEN 1
        END AS AgeBusiness
) vars

如果当 A.[End_Date] 为 null 时,C2.[BUS_DY_OF_CAL_NUM] 也将为 null 您可以这样重写第一个 case 语句:

 ABS(COALESCE(COALESCE(C2.[BUS_DY_OF_CAL_NUM],C3.[BUS_DY_OF_CAL_NUM])-C1.[BUS_DY_OF_CAL_NUM],1))

您还可以在 case 语句中使用 BETWEEN 并对单个值进行操作,因此请像这样重写第二个值:

CASE ABS(COALESCE(COALESCE(C2.[BUS_DY_OF_CAL_NUM],C3.[BUS_DY_OF_CAL_NUM])-C1.[BUS_DY_OF_CAL_NUM],1))
     WHEN AgeBusiness >= 0 AND AgeBusiness <11 AND Name = "RequirementA" Then 1 
     WHEN BETWEEN 0 AND 11  AND Name = "RequirementB" Then 1  
     WHEN BETWEEN 0 AND 181 AND Name = "RequirementC" Then 1
     WHEN BETWEEN 0 AND 8   AND Name = "RequirementD" Then 1
     WHEN BETWEEN 0 AND 11  AND Name = "RequirementE" Then 1
     WHEN BETWEEN 0 AND 16  AND Name = "RequirementF" Then 1
End AS WithinRequirements

我认为此查询比您原来的查询少"long winded"。