添加具有基于 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
然后在 incidentid
和 min(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
我有 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
然后在 incidentid
和 min(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