Sql 账龄-日历和工作日数据的不同记录

Sql 账龄-日历和工作日数据的不同记录,sql,sql-server-2012,calendar,case,date-difference,Sql,Sql Server 2012,Calendar,Case,Date Difference,我目前正在使用SQL Server 2012,我有一个老化问题。我试图在下面包含一些样本数据和4条记录 FileNumber FileType CompletedDate 90440 Internal 8/11/2017 90440 Strategy NULL 90441 Internal 8/10/2017 90441 Strategy NULL 策略的账龄从内部文件类型

我目前正在使用SQL Server 2012,我有一个老化问题。我试图在下面包含一些样本数据和4条记录

FileNumber    FileType     CompletedDate
 90440        Internal      8/11/2017
 90440        Strategy       NULL
 90441        Internal      8/10/2017
 90441        Strategy       NULL
策略的账龄从内部文件类型的完成日期一直计算到策略文件类型的完成日期。每个文件号都可以有多个与之关联的文件类型。如果策略的完成日期为空,则它将从内部文件类型的完成日期一直到今天的日期或GETDATE()

因此,我试图显示待定策略的计数以及它们在业务和日历日中的当前老化情况……因此,本质上我希望数据像这样返回

File Number    FileType    AgeBusiness  AgeCalendar
 90440          Strategy     2            4
 90441          Strategy     3            5

你知道我会怎么做吗?非常感谢您的帮助。

类似的方法可能会奏效,但我不能100%确定,因为这取决于表中的文件类型,是否考虑假期,策略(或最新文件类型)有“完成日期”值时会发生什么

;WITH Internal AS
(
    select  FileNumber, FileType,
            DATEDIFF(day,CompletedDate,getdate())- (datediff(wk, CompletedDate, getdate()) * 2) -
                case when datepart(dw, CompletedDate) = 1 then 1 else 0 end +
                case when datepart(dw, getdate()) = 1 then 1 else 0 end as AgeBusiness,
            DATEDIFF(day,CompletedDate,getdate()) as AgeCalendar
    from @test
    where FileType = 'Internal'
)
select t.FileNumber, t.FileType, i.AgeBusiness, i.AgeCalendar
from @test t
inner join Internal i on
    (t.FileNumber = i.FileNumber)
where CompletedDate is null
上面的问题是,如果策略(或任何最新的文件类型)有一个完成日期,它将不会显示一行。因此,您可能需要以下内容

;WITH Internal AS
(
    select  FileNumber, FileType,
            DATEDIFF(day,CompletedDate,getdate())- (datediff(wk, CompletedDate, getdate()) * 2) -
                case when datepart(dw, CompletedDate) = 1 then 1 else 0 end +
                case when datepart(dw, getdate()) = 1 then 1 else 0 end as AgeBusiness,
            DATEDIFF(day,CompletedDate,getdate()) as AgeCalendar
    from @test
    where FileType = 'Internal'
), Latest AS
(
    select FileNumber, FileType, RANK() OVER   
        (PARTITION BY FileNumber ORDER BY COALESCE(CompletedDate,GETDATE()) DESC) AS rnk
    from @test
)
select l.FileNumber, l.FileType, i.AgeBusiness, i.AgeCalendar
from Latest l
inner join Internal i on
    (l.FileNumber = i.FileNumber)
where rnk = 1

无论行是否为null,它都将显示该行,但代价是添加一个更密集的RANK()。

您不需要CTE,但我将其包括在内以使其更具可读性

WITH DateRanges AS (
SELECT yt.FileNumber
    ,yt.FileType
    ,SELECT TOP 1 CompletedDate FROM YourTable WHERE yt.FileNumber = FileNumber AND FileType = 'Internal'  AS InternalCompletedDate
    ,CASE WHEN yt.CompletedDate IS NULL THEN CAST(GETDATE() AS DATE) ELSE yt.CompletedDate END AS StrategyCompletedDate -- I forgot the NULL part too...
FROM YourTable yt
WHERE yt.FileType = 'Strategy'
)

SELECT FileNumber
    ,FileType
    ,(DATEDIFF(dd,InternalCompletedDate, StrategyCompletedDate) + 1)
  -(DATEDIFF(wk, InternalCompletedDate, StrategyCompletedDate) * 2)
  -(CASE WHEN DATENAME(dw, InternalCompletedDate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, StrategyCompletedDate) = 'Saturday' THEN 1 ELSE 0 END) AS AgeBusiness    
    ,DATEDIFF(dd, InternalCompletedDate, StrategyCompletedDate) AS AgeCalendar
    FROM DateRanges

编辑:现在应该很好了。我有点匆忙。

你说“如果策略的完成日期为空,那么…”,如果不是空呢?你能解释一下“每个文件号可以有多个与之关联的文件类型吗?”?你是说可以有不止一个“内部”和“战略”吗?此外,工作日可能会有一些棘手的假期。你有“天”表吗?@justice-在这个例子中…FileNumber可以有一个内部文件和一个与之关联的策略文件。没有倍数。我有一张DT.DIM days表。-元素..我已经得到了那部分。我的查询和@justiceorjustus的区别在于,我假设如果您有多个文件类型,最新的文件类型将是没有完整日期的文件类型,因为该文件类型是您要显示的文件类型。但是,如果CompletedDate有一个值,它就有一个问题,那该怎么办(因此我问了)。如果您只想显示策略文件类型,那么his将是一个更好的答案。