【问题标题】:Creating a total difference comparison row automatically自动创建总差比较行
【发布时间】:2019-12-09 07:11:26
【问题描述】:

这里是一些示例数据,显示了具有特定 ID 的开始日期和结束日期的各种雕像。

Days Elapsed 列是特定行的日期差异。

select 
    *,
    DateDiff(d,StartDate,EndDate) as DaysElapsed 
from 
    #Sample

我正在尝试将特定 ID 的总经过天数与第一个 StartDate 和最大的 End Date 进行比较。

在 ID 1 的情况下,经过了 22 天 (7+8+7),但是当您将第一个开始日期 (2019-11-01) 与最后一个结束日期 (2019-11-25) 进行比较时,它实际上是 24。所以我需要为 ID 1 添加另一行,其状态为“不正确的流”,经过的天数值为 2。如果匹配,则不会添加任何行。

如果记录的结束日期值为 NULL,则应该简单地忽略该 ID。所以预期的结果是:

样本数据

Create Table #Sample
(
    ID int,
    Status varchar(20),
    StartDate datetime,
    EndDate datetime
)

insert into #Sample
(
    ID,
    Status,
    StartDate,
    EndDate
)
select
    1,
    'Status 1',
    '01 Nov 2019',
    '08 Nov 2019'
union all
select
    1,
    'Status 2',
    '10 Nov 2019',
    '18 Nov 2019'
union all
select
    1,
    'Status 3',
    '18 Nov 2019',
    '25 Nov 2019'
union all
select
    2,
    'Status 1',
    '02 Nov 2019',
    '09 Nov 2019'
union all
select
    2,
    'Status 2',
    '16 Nov 2019',
    '29 Nov 2019'
union all
select
    2,
    'Status 3',
    '29 Nov 2019',
    '03 Dec 2019'
union all
select
    2,
    'Status 4',
    '03 Dec 2019',
    '08 Dec 2019'
union all
select
    3,
    'Status 1',
    '01 Dec 2019',
    '03 Dec 2019'
union all
select
    3,
    'Status 2',
    '03 Dec 2019',
    NULL

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    首先您使用incorrect Flow 标识这些ID。您可以通过比较datediff(day, min(StartDate), max(EndDate))sum(datediff(day, StartDate, EndDate)) 来做到这一点

    然后JOIN#Sample 返回结果。要显示额外的行 Incorrect Flow 使用 UNION ALL

    with err_id as
    (
        select  ID, 
                DaysElapsed = datediff(day, min(StartDate), max(EndDate))
                            - sum(datediff(day, StartDate, EndDate))
        from    #Sample
        group by ID
        having  datediff(day, min(StartDate), max(EndDate))
        <>      sum(datediff(day, StartDate, EndDate))
    )
    select  s.*, DaysElapsed = datediff(day, StartDate, EndDate)
    from    err_id e
            inner join #Sample s    on  e.ID    = s.ID
    
    union all
    
    select  ID, Status = 'Incorrect Flow', StartDate = NULL, EndDate = NULL, DaysElapsed 
    from    err_id
    

    【讨论】:

    • 谢谢@Squirrel,唯一的问题是它没有显示结果集中的 DaysElapsed 差异是什么。
    • 刚刚添加了
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多