2016-08-04 4 views
1

하나의 CASE WHEN 조건 (CompanyGUID 및 LineGUID)이 있고 4 개의 다른 열이있는 4 가지 계산이 필요합니다. 계산이 정상적으로 작동하지만 더 편리하게 사용할 수있는 방법이 궁금합니다. 이 경우 COALESCE 트릭을 사용하는 것과 같습니다.중첩 된 CASE WHEN 문

CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02' 
     AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB' 
    THEN isnull(ddaWC.archexMod,1) 
    END as ExperienceMod, 

CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02' 
     AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB'   
    THEN case when convert(int,ddawc.premModTtl) <= 0 then 1 
       when convert(int,ddawc.premModTtl) >= 0 
       then (1 + ddaWC.premschmod/ddawc.premModTtl) end 
    END as ScheduleMod, 

CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02' 
     AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB' 
    THEN isnull(ddaWC.TMpercent,1) END as TerritoryMod, 

CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02' 
     AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB' 
    THEN case when convert(int,ddaWC.SchedPercent) = 0 or 
        ddaWC.SchedPercent is not null 
       then (isnull(ddaWC.archexMod,1) 
        * (convert(decimal(5,2),isnull(ddaWC.SchedPercent,1)))) 
        * isnull(ddaWC.TMpercent,1) 
       when ddaWC.SchedPercent is null 
        then 1 END 
    END as EffectiveMod 
+0

더 편리함이란 무엇을 의미합니까? 적은 코드를 입력해야합니까? – iamdave

+0

죄송합니다. 한 번만 (CompanyGUID 및 LineGUID) 사용할 수 있으며 결과적으로 4 개의 다른 열이있을 수 있습니까? – Oleg

+0

더 좋은 방법,이 쿼리를 작성하는 더 전문적인 방법을 말할 수 있습니다. – Oleg

답변

3

뭔가 (하지만 논리를 확인) : SQL 코드로 줄일 수 있을까? OUTER APPLY은 행 기반 선택을 수행하여 조건이 채워지지 않을 경우 NULLs을 반환합니다. 그렇지 않으면 지정한 값과 동일한 값이 반환됩니다. 모든 컬럼에 대해 동일한 논리가 실제로 필요한 경우에만 작동합니다.

SELECT otherColumn 
     ,ConditionalColumns.* 
FROM YourTable 
OUTER APPLY 
(
    SELECT isnull(ddaWC.archexMod,1) as ExperienceMod, 
      case when convert(int,ddawc.premModTtl) <= 0 then 1 
       when convert(int,ddawc.premModTtl) >= 0 
       then (1 + ddaWC.premschmod/ddawc.premModTtl) end as ScheduleMod, 
      isnull(ddaWC.TMpercent,1) as TerritoryMod, 
      case when convert(int,ddaWC.SchedPercent) = 0 or ddaWC.SchedPercent is not null 
       then (isnull(ddaWC.archexMod,1) 
         * (convert(decimal(5,2),isnull(ddaWC.SchedPercent,1)))) 
         * isnull(ddaWC.TMpercent,1) 
       when ddaWC.SchedPercent is null 
       then 1 END as EffectiveMod 
    WHERE dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02' 
      AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB' 
) AS ConditionalColumns 
+0

외부 적용 하위 쿼리 적용! 굉장해. 네가 할 수 있다는 것을 몰랐어. –

+0

@CharlesBretana 예, 좋습니다! 반복 된 코드를 피하기 위해이 값을 계산 된 값에 자주 사용합니다. 예를 들어 별칭과 비슷한 것. – Shnugo

1
이 같이

:

코드 앞에 :

Declare @compGuid char(37) = '29634AF7-D0A2-473D-9574-405C23E10F02' 
Declare @lineGuid char(37) = '1CB72920-B3FC-4822-8030-37B50A2810EB' 

및 별칭 tblCompanyLocations에 대한
cl를 정의하는 SQL 문에 절에서 수정 한 다음 tblQuotes
에 대한
q 의 Select 절에있는 경우

좀 더 읽을 수
case when cl.CompanyGUID = @compGuid 
      and q.LineGUID = @lineGuid 
     then isnull(ddaWC.archexMod,1) end ExperienceMod, 

case when cl.CompanyGUID = @compGuid 
      and q.LineGUID = @lineGuid   
     then case when cast(ddawc.premModTtl as int) > 0 
       then (1 + ddaWC.premschmod/ddawc.premModTtl) 
       else 1 end end ScheduleMod, 

case when cl.CompanyGUID = @compGuid 
     and q.LineGUID = @lineGuid 
     then isnull(ddaWC.TMpercent,1) end TerritoryMod, 

case when cl.CompanyGUID = @compGuid 
     and q.LineGUID = @lineGuid 
     then case when cast(ddaWC.SchedPercent as int) = 0 
        then isnull(ddaWC.archexMod,1) 
         * cast(ddaWC.SchedPercent as decimal(5,2))) 
         * isnull(ddaWC.TMpercent,1) 
       when ddaWC.SchedPercent is null 
        then 1 end end EffectiveMod 

이 ... 이런

+0

당신은 무거운 부분을하고 논리를 청소했습니다. 내 편에서 +1 ... 제 생각에 가장 좋은 것은 당신과 나의 것을 결합시키는 것입니다 :-) – Shnugo

+0

@ Shnugo, (이번에는 SP를 얻으십시오!) Thx! 뭔가 배웠습니다 ... 하위 쿼리에 대해 외부 적용을 실행할 수 있는지 몰랐습니다. 그것은 UDF에만 해당된다고 생각했습니다. –