2012-08-07 6 views
0

제품 유형 열을 기반으로 특정 기준을 선택하기 위해 where 절에서 case 문을 사용하는 방법을 파악하려고합니다. where 절의 첫 번째 부분은 두 시나리오에서 공통입니다. 상품 유형이 STD 인 경우 엔 EntryDate가 현재 달 전일과 어제 사이인지 확인해야합니다. 제품이 LTD 인 경우 엔 EntryDate가 어제와 이틀 전인지를 확인해야합니다.where 절 기준을 열 값을 기준으로 변경하십시오.

DECLARE @firstDayOfCurrentMonth datetime 
SET @firstDayOfCurrentMonth = CAST(CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '/' + CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '/01' AS DATETIME) 

SELECT DCMNumber, COUNT(*) AS PriorDenied 
FROM cauAssignedClaim 
WHERE RecordType = 'A' AND [Status] IS NULL AND 
CASE WHEN Product = 'LTD' THEN EntryDate BETWEEN @firstDayOfCurrentMonth AND GETDATE()-1 
CASE WHEN Product = 'STD' THEN EntryDate BETWEEN DATEADD(Day, -7, GETDATE()-1) AND GETDATE()-1 
END 
GROUP BY [Status], DCMNumber 

답변

0

당신은

WHERE EntryDate BETWEEN 
    CASE WHEN Product = 'LTD' THEN @FirstDatetc 
     ELSE DateAdd(blah) 
    END 
AND GetDate()-1 
을 원하는가

그것은 시도한 적이 없기 때문에 이것이 유효한 구문이라고 가정합니다. :)

나는 이것을 좋아한다. 아주 간결하기 때문에 - 당신이 그것을 포맷한다면 나는 또한 그것도 읽기 쉽다고 생각한다.

+0

시도해 보았다! :) – Charleh

+0

감사 작품은 훌륭합니다! – user1331734

2

여기서 CASE 문구를 사용할 필요가 없습니다. 당신은 당신의 WHERE에 대한 추가 조항을 추가 할 수 있습니다

DECLARE @firstDayOfCurrentMonth datetime 
SET @firstDayOfCurrentMonth = CAST(CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '/' + CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '/01' AS DATETIME) 

SELECT DCMNumber, COUNT(*) AS PriorDenied 
FROM cauAssignedClaim 
WHERE RecordType = 'A' 
    AND [Status] IS NULL 
    AND 
    ( 
     (
      Product = 'LTD' 
      AND EntryDate BETWEEN @firstDayOfCurrentMonth AND GETDATE()-1 
     ) 
     OR 
     (
      Product = 'STD' 
      AND EntryDate BETWEEN DATEADD(Day, -7, GETDATE()-1) AND GETDATE()-1 
     ) 
    ) 

GROUP BY [Status], DCMNumber 

을 그냥 참고로, 여기에 달의 첫날 얻을 수있는 짧은 방법입니다 :

SELECT DATEADD(m,DATEDIFF(m,0,getdate()),0)