【问题标题】:Sql Server retrieve last date for multiple recordsSql Server 检索多条记录的最后日期
【发布时间】:2016-12-26 00:15:02
【问题描述】:

我有一个包含 5 列的表格 EmpSurnameCSDTerm RsnDate。前 4 列将保持不变,但日期会改变,例如。 Emp 可以有 30 条记录,其中包含 30 个不同的日期。

这是我的代码,但是当我将 [Date] 添加到选择中时,它会返回所有 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'

【问题讨论】:

  • 在子查询中添加 Where 条件(emp id)并尝试一下。
  • 您是否考虑过规范化您的数据?

标签: sql sql-server


【解决方案1】:

选择日期字段时,请使用: 选择 max(Date),Emp,Surname 从表 按 Emp,Surname 分组

This will give you one record per employee.I hope this helps.

【讨论】:

    【解决方案2】:

    如下写:

    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

    【讨论】:

    • 如果 Term Rsn 不为空,我不想打印日期,我会添加什么?
    • 我没听懂你..在上面的两个案例语句中,您都为 [Term Rsn] != 0 only 添加了案例条件..
    • 对不起,它们都用于确定要使用的日期。对于 Term Rsn,如果它不是 0,那么我想打印日期,如果它是 0,那么我想打印“NULL”或其他日期
    • 在这种情况下,当 [Term Rsn] = 0 时,您可以添加一个虚拟日期,例如“01-01-1900”或“01-01-1800”,无论这可能不是一个可行的日期值在内部查询和外部查询中的列中,您可以将案例过滤器添加为: * Case when MAx(Date) ='01-01-1800' then '' else Max(Date) end as [Date].*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多