Sql Server检索多条记录的最后日期

Sql Server检索多条记录的最后日期,sql,sql-server,Sql,Sql Server,我有一个表,有5列Emp,姓氏,CSD,术语Rsn和日期。前4列将保持不变,但日期将发生变化,例如,一个Emp可能有30条记录,其中有30个不同的日期 这是我的代码,但当我将[Date]添加到select时,它会返回所有30条记录,而我试图返回一条带有最后日期的记录 Create PROCEDURE testPro( @reportStartDate date, @reportEndDate date ) AS BEGIN SELECT DISTINCT E

我有一个表,有5列
Emp
姓氏
CSD
术语Rsn
日期
。前4列将保持不变,但日期将发生变化,例如,一个Emp可能有30条记录,其中有30个不同的日期

这是我的代码,但当我将[Date]添加到select时,它会返回所有30条记录,而我试图返回一条带有最后日期的记录

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'
创建过程testPro(
@报告开始日期,
@reportEndDate日期
)    
作为
开始

选择日期字段使用时,选择不同的Emp、姓氏、CSD、CSD时的大小写: 选择max(日期)、Emp、姓氏 从桌子上 按Emp、姓氏分组

This will give you one record per employee.I hope this helps.
写如下:

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'
创建过程testPro(
@报告开始日期,
@reportEndDate日期
)    
作为
开始
选择Emp、姓氏、CSD、[工作日],最大(日期)作为[日期]
从(

选择DISTINCT Emp,姓氏,CSD,CASE WHEN CSDAdd Where condition(Emp id)在子查询中并尝试它。您是否考虑过将数据标准化?如果我不想在术语Rsn不为空的情况下打印日期,我会添加什么?我不明白。在上面的CASE语句中,您为[Term Rsn]添加了CASE条件!=0仅..很抱歉,它们都用于确定要使用的日期。对于术语Rsn,如果它不是0,则我要打印日期,如果它是0,则我要打印日期的“NULL”或其他内容在这种情况下,当[Term Rsn]=0您可以添加一个虚拟日期,例如“01-01-1900”或“01-01-1800”,无论在内部查询中日期列的值是否可行,在外部查询中,您可以添加一个案例筛选器:*案例当MAx(date)=“01-01-1800”时,则“”否则MAx(date)结束为[date]*