添加具有基于 SQL 视图中另一个不同列的值的列 - 列的平均值

Add column with value based on another distinct column in SQL View- Average of column

我有 table 以下数据。我想在 SQL 视图中再添加一列 'Resolution Time',其中包含当前 table 中的所有列。

Resolution Time=DATEDIFF(DAY,[INC CreatedOn],[ResolvedOn]) 这需要根据不同的票号计算。

IncidentID TicketNumber PaymentID Amount Inc CreatedOn Payment CreatedOn ResolvedOn
1 INC-01 1a 100 05-Jan-22 05-Jan-22 08-Jan-22
1 INC-01 2a 200 05-Jan-22 06-Jan-22 08-Jan-22
1 INC-01 3a 400 05-Jan-22 07-Jan-22 08-Jan-22
2 INC-02 4a 300 01-Feb-22 04-Feb-22 10-Feb-22
2 INC-02 5a 500 01-Feb-22 07-Feb-22 10-Feb-22
3 INC-03 6a 200 01-Mar-22 02-Mar-22 05-Mar-22
4 INC-04 7a 800 04-Mar-22 05-Mar-22 10-Mar-22
4 INC-04 8a 900 04-Mar-22 08-Mar-22 10-Mar-22

ResolutionTime 列的预期结果

IncidentID TicketNumber PaymentID Amount Inc CreatedOn Payment CreatedOn ResolvedOn ResolutionTimeinDays
1 INC-01 1a 100 05-Jan-22 05-Jan-22 08-Jan-22 3
1 INC-01 2a 200 05-Jan-22 06-Jan-22 08-Jan-22
1 INC-01 3a 400 05-Jan-22 07-Jan-22 08-Jan-22
2 INC-02 4a 300 01-Feb-22 04-Feb-22 10-Feb-22 9
2 INC-02 5a 500 01-Feb-22 07-Feb-22 10-Feb-22
3 INC-03 6a 200 01-Mar-22 02-Mar-22 05-Mar-22 4
4 INC-04 7a 800 04-Mar-22 05-Mar-22 10-Mar-22 6
4 INC-04 8a 900 04-Mar-22 08-Mar-22 10-Mar-22

我尝试添加 Datediff 逻辑,但它会计算每一行。

注意:我需要根据唯一的事件工单号获取解决时间的平均值。

所以在这里, avg(解决时间) = (3+9+4+6)/4

在此处添加更多可能有助于构建查询的信息

事件 table 有以下专栏

|事故编号 |票号 | Inc 创建于 |已解决 |

付款table

|事故编号 |付款编号 |金额 |付款创建于 |

一个事件 ID 可以有多个付款,因此它的(事件)一对多(付款)在 Incident.IncidentID=Payment.IncidentID

上加入

我需要创建一个 SQL 视图,它也应该有解决时间,以便可以得出解决时间的平均值用于报告

如有任何帮助,我们将不胜感激! 谢谢

很难说出您的视图代码是什么。

如果您不希望每个列表都有该值,您可以 (a) 创建另一个 GroupBy table 以查看视图中的哪条记录需要具有ResolutionTimeinDays 字段然后 运行 一个案例语句或 (b) 有另一列说明哪个记录是主记录,并且只更新视图上的值

我建议 (a),因为 (b) 正在更新更多视图。您需要弄清楚如何以编程方式说第 1 行将获得 ResolutionTimeinDays 值而不是第 2 行。为此,您通过内部查询创建另一个组,并降低日期的聚合函数。然后查看如何将其唯一地分组回您的结果。

用于查找要将值添加到的特定行的内部 groupby:

select incidentid, min(Paymentcreatedon) from tab group by incidentid

然后在 incidentidmin(Paymentcreatedon) 上将其加入您的 table。但请确保它是一种独特的加入方式。

您想要的输出一点也不清楚。我将向您展示您可以 return 您发布的值。然后还有如何获得您想要的平均值。

首先我们需要一些样本数据来处理。

declare @Something table
(
    IncidentID int
    , TicketNumber varchar(20)
    , PaymentID varchar(10)
    , Amount int
    , IncCreatedOn date
    , PaymentCreatedOn date
    , ResolvedOn date
)
insert @Something
select 1, 'INC-01', '1a', '100', '05-Jan-22', '05-Jan-22', '08-Jan-22' union all
select 1, 'INC-01', '2a', '200', '05-Jan-22', '06-Jan-22', '08-Jan-22' union all
select 1, 'INC-01', '3a', '400', '05-Jan-22', '07-Jan-22', '08-Jan-22' union all
select 2, 'INC-02', '4a', '300', '01-Feb-22', '04-Feb-22', '10-Feb-22' union all
select 2, 'INC-02', '5a', '500', '01-Feb-22', '07-Feb-22', '10-Feb-22' union all
select 3, 'INC-03', '6a', '200', '01-Mar-22', '02-Mar-22', '05-Mar-22' union all
select 4, 'INC-04', '7a', '800', '04-Mar-22', '05-Mar-22', '10-Mar-22' union all
select 4, 'INC-04', '8a', '900', '04-Mar-22', '08-Mar-22', '10-Mar-22' 
;

此查询将return您所说的数据。

select *
    , ResolutionTimeinDays = case when ROW_NUMBER()over(partition by TicketNumber order by PaymentID) = 1 then datediff(day, IncCreatedOn, ResolvedOn) end
from @Something s
order by s.IncidentID
    , s.PaymentID

您可以轻松地利用上述查询来获得平均值。

with MyCte as
(
    select *
        , ResolutionTimeinDays = case when ROW_NUMBER()over(partition by TicketNumber order by PaymentID) = 1 then datediff(day, IncCreatedOn, ResolvedOn) end
    from @Something s
)

select AVG(ResolutionTimeinDays * 1.0) --multiplied here by 1.0 or the average function will be returned as an integer
from MyCte
where ResolutionTimeinDays is not null