2014-06-09 3 views
0

5 개의 열이있는 테이블이 있습니다. Emp, Surname, CSD, Term RsnDate입니다. 처음 4 개의 열은 동일하게 유지되지만 날짜가 바뀝니다. 30 가지 날짜가있는 Emp에 대해 30 개의 레코드가있을 수 있습니다. SQL Server가 여러 레코드의 마지막 날짜를 검색합니다.

작동하는 내 코드입니다하지만 난 그게 내가 날짜 필드 사용을 선택하면 마지막 날짜

Create PROCEDURE testPro( 
@reportStartDate date, 
@reportEndDate date  
)  
AS 
BEGIN  


SELECT DISTINCT Emp, Surname, CSD, CASE WHEN CSD<= @reportStartDate 
THEN 

CASE WHEN [Term Rsn] != 0 THEN 
CASE WHEN [Date] <= @reportEndDate THEN 
(DATEDIFF(dd,@reportStartDate, [Date]) - (2* 
DATEDIFF(wk,@reportStartDate,[Date])))+1 ELSE (DATEDIFF(dd,@reportStartDate, @reportEndDate) - (2* 
DATEDIFF(wk,@reportStartDate,@reportEndDate)))+1 END ELSE (DATEDIFF(dd,@reportStartDate, @reportEndDate) - (2* 
DATEDIFF(wk,@reportStartDate,@reportEndDate)))+1 END 


ELSE 

CASE WHEN [Term Rsn] != 0 THEN 
CASE WHEN [Date] <= @reportEndDate THEN 
(DATEDIFF(dd,CSD, [Date]) - (2* 
DATEDIFF(wk,CSD,[Date])))+1 ELSE (DATEDIFF(dd,CSD, @reportEndDate) - (2* 
DATEDIFF(wk,CSD,@reportEndDate)))+1 END ELSE (DATEDIFF(dd,CSD, @reportEndDate) - (2* 
DATEDIFF(wk,CSD,@reportEndDate)))+1 END 

END AS [Working Days] 

FROM GyPremiumsTemp 
WHERE CSD < @reportEndDate AND [Date] > @reportStartDate --AND [Date] = (select max([Date]) FROM GyPremiumsTemp) 
ORDER BY Emp ASC 
END 


    EXEC testPro '2012-01-01', '2012-12-31' 
+0

하위 쿼리에서 조건 (emp id)을 추가하고 시도하십시오. – Jesuraja

+0

** 정상화 ** 데이터를 고려하셨습니까? – podiluska

답변

0

쓰기 :

Create PROCEDURE testPro( 
@reportStartDate date, 
@reportEndDate date  
)  
AS 
BEGIN 
select Emp, Surname, CSD,[Working Days] , Max(Date) as [Date] 
From (
SELECT DISTINCT Emp, Surname, CSD, CASE WHEN CSD<= @reportStartDate 
THEN 

CASE WHEN [Term Rsn] != 0 THEN 
CASE WHEN [Date] <= @reportEndDate THEN 
(DATEDIFF(dd,@reportStartDate, [Date]) - (2* 
DATEDIFF(wk,@reportStartDate,[Date])))+1 
ELSE (DATEDIFF(dd,@reportStartDate, @reportEndDate) - (2* 
DATEDIFF(wk,@reportStartDate,@reportEndDate)))+1 END 
ELSE (DATEDIFF(dd,@reportStartDate, @reportEndDate) - (2* 
DATEDIFF(wk,@reportStartDate,@reportEndDate)))+1 END 


ELSE 

CASE WHEN [Term Rsn] != 0 THEN 
CASE WHEN [Date] <= @reportEndDate THEN 
(DATEDIFF(dd,CSD, [Date]) - (2* 
DATEDIFF(wk,CSD,[Date])))+1 
ELSE (DATEDIFF(dd,CSD, @reportEndDate) - (2* 
DATEDIFF(wk,CSD,@reportEndDate)))+1 END 
ELSE (DATEDIFF(dd,CSD, @reportEndDate) - (2* 
DATEDIFF(wk,CSD,@reportEndDate)))+1 END 

END AS [Working Days],[Date] -- Add all Dates here 

FROM GyPremiumsTemp 
WHERE CSD < @reportEndDate AND [Date] > @reportStartDate 
) T 
Group By Emp, Surname, CSD,[Working Days] 
ORDER BY Emp ASC 
END 


EXEC testPro '2012-01-01', '2012-12-31' 

확인 Demo 여기에.

+0

고맙습니다. – Cheesy

+0

Term Rsn이 null이 아닌 경우 날짜를 인쇄하고 싶지 않다면 무엇을 추가할까요? – Cheesy

+0

나는 당신을 얻지 못했다. 위의 두 문장 모두 [Term Rsn]에 대한 대소 문자 조건을 추가했다! = 0 만 .. – Deepshikha

1

에 하나 개의 레코드를 반환하려고하는 반면 모든 30 개 레코드를 반환 선택에 [날짜]를 추가 할 때 : 아래 선택 최대 (일), EMP를, EMP를하여 테이블 그룹에서 성 , 성

This will give you one record per employee.I hope this helps. 
관련 문제