【问题标题】:Substract column value in the next row with Decimal Output SQL Server 2008使用十进制输出 SQL Server 2008 减去下一行中的列值
【发布时间】:2018-07-11 17:44:59
【问题描述】:

我想在每次状态为“已审核”且 ID 号相同时以十进制数检索天数,按 ID 分组。

这就是表格Audit_Event 的样子:

ID           STATUS           EVENT_DATE
--           ------           ----------
1012         Fastrack         2018-05-24 10:07:46.560
1000         Reviewed         2018-05-25 12:35:07.023
1000         Declined         2018-06-15 21:02:32.567
1234         Cancelled        2018-05-01 13:00:35.257
1000         Reviewed         2018-06-16 10:46:41.607
1000         Completed        2018-06-20 13:08:27.697
2135         Approved         2018-06-20 16:18:27.240
1000         Cancelled        2018-06-27 15:11:33.930 
1035         Lead             2018-04-02 13:35:51.817
1000         Pre-Approval     2018-04-02 13:32:57.120       

以ID为例=1000,状态=Reviewed:

(2018-06-15 21:02:32.567 - 2018-05-25 12:35:07.023) + (2018-06-20 13:08:27.697 - 2018-06-16 10:46:41.607) = 25.45 (Days)

所以输出应该是:

ID            Number_Days
--------      ---------
1012           NULL
1000           25.45
1234           NULL
2135           NULL

这是我现在使用的查询:

IF OBJECT_ID(N'tempdb..#Reviewed_Table', N'U') IS NOT NULL  
    DROP TABLE #Reviewed_Table   

CREATE TABLE #Reviewed_Table
(
    RN INT,
    ID VARCHAR(50),
    EVENT_DATE DATETIME,
    STATUS VARCHAR(500)
)

INSERT INTO #Reviewed_Table
    SELECT 
        ROW_NUMBER() OVER (ORDER BY ID) RN, 
        ID, EVENT_DATE, STATUS
    FROM 
        Audit_Event 


SELECT 
    T1.ID, 
    CONVERT(DECIMAL(16, 4), (SUM(DATEDIFF(DAY, T1.Event_Date, T2.Event_Date)))) Rev_Days
FROM 
    #Reviewed_Table T1  
LEFT JOIN 
    #Reviewed_Table T2 ON T1.RN = T2.RN -1
WHERE 
    T1.STATUS = 'Reviewed' 
GROUP BY 
    T1.ID

注意:我不能使用LEADLAG,因为这是一台 SQL Server 2008 机器。

如果状态不同于Reviewed 应该为NULL。审核的状态可以超过2个,可能的状态也更多。

任何帮助或帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:

    如果你只看下一条记录,那么你可以使用cross apply:

    select rt.id,
           ( datediff(second, rt.event_date, rt2.event_date) / (24 * 60 * 60.0) ) as number_days
    from #Reviewed_Table rt outer apply
         (select top (1) rt2.*
          from #Reviewed_Table rt2
          where rt2.id = rt.id and rt2.event_date > rt.event_date
          order by rt2.event_date asc
         ) rt2
    where rt.status = 'Reviewed'
    group by rt.id;
    

    【讨论】:

    • 有没有漏掉 rt.id 后面的逗号?
    • @JCACERES 。 . .谢谢。
    • 到目前为止工作得很好,我怎样才能将小数的比例缩小为 .00 这样的 2 位数字?
    • @JCACERES 。 . .您可以转换为 decimal(10, 2) 或使用 str() 函数。
    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多