计算平均时间和获胜百分比

Calculate Avg time and Won %

下面是我的数据库 table 在 SQL 服务器

Status      Start_Date          End_Date           Category
Won         2020-03-11 17:01    2020-11-17 11:36   A
Won         2020-03-11 17:00    2020-11-13 19:07   B
Won         2020-03-11 17:00    2020-11-12 13:40   A
Lost        2020-03-11 16:59    2020-11-12 13:06   B
Lost        2020-03-11 12:20    2020-11-12 12:58   C
Initiated   2020-02-11 19:31                       C
Initiated   2020-02-11 17:05                       B
Won         2020-02-11 12:25    2020-11-10 12:55   A
Lost        2020-02-11 12:23    2020-11-09 16:35   A
Lost        2020-02-11 12:22    2020-11-09 16:32   A

我想要获得 2 个输出,一个是整体统计数据,第二个是类别统计数据。

总的来说,我希望单个查询中的赢得百分比和平均天数、小时数。

输出应该是这样的

Won%    AvgTime
4%      2 Days 13 Hours 

如果平均时间小于 24 小时,则不应显示日期,而应仅显示小时。

对于类别而言,单个查询中的输出应该是这样的

Category     Won%     AvgTime
A            4%       2 Days 13 hours
B            1%       7 hours
C            0%       

提前致谢。

我已经尝试了以下查询,但因为我不知道我的方向是否正确而感到困惑并停止了

select (
        select count(*)
        from jap.dbo.JAP_Master_Table j2
        where Status like '%won%'
    )
    , avg(DATEDIFF(day,Start_date,End_Date))
from jap.dbo.JAP_Master_Table j1

更新

我进一步尝试了整体结果查询,我得到的输出有点接近我想要的查询结果

select round(cast((select count(*) from jap.dbo.JAP_Master_Table j2 where Status like '%won%') as float)/ cast((count(*)) as float),2) as [Won%]
,avg(DATEDIFF(day,EntryDate,CAMStatusUpdatedon)) as AverageTime from jap.dbo.JAP_Master_Table j1

输出为

Won%    AverageTime
0.02    11

但查询效率不高,输出仅以分钟为单位提供平均时间,而不是我想要的格式。我正在尝试,但如果有人能为我提供更有效的东西,我将不胜感激。

这是相当简单的聚合,尽管您试图显示的内容的复杂性并不过分直观。我建议不要尝试从 SQL 中获取 x Days, y Hours, z Minutes 格式,而是在表示层中执行此操作。从以下示例中可以看出,在 SQL 中执行此操作并不理想:

查询

declare @t table([Status] varchar(20),[Start_Date] datetime,End_Date datetime,Category varchar(1));
insert into @t values
 ('Won'         ,'2020-03-11 17:01','2020-11-17 11:36','A')
,('Won'         ,'2020-03-11 17:00','2020-11-13 19:07','B')
,('Won'         ,'2020-03-11 17:00','2020-11-12 13:40','A')
,('Lost'        ,'2020-03-11 16:59','2020-11-12 13:06','B')
,('Lost'        ,'2020-03-11 12:20','2020-11-12 12:58','C')
,('Initiated'   ,'2020-02-11 19:31',null,'C')
,('Initiated'   ,'2020-02-11 17:05',null,'B')
,('Won'         ,'2020-02-11 12:25','2020-11-10 12:55','A')
,('Lost'        ,'2020-02-11 12:23','2020-11-09 16:35','A')
,('Lost'        ,'2020-02-11 12:22','2020-11-09 16:32','A')
;

select sum(case when [Status] = 'Won' then 1.0 else 0.0 end) / count([Status]) as [Won%]
      ,avg(datediff(minute,[Start_Date],End_Date)) as AvgTimeMins
      ,isnull((cast(nullif(avg(datediff(minute,[Start_Date],End_Date)) / 1440, 0) as varchar(5)) + ' Days, '), '')
       + isnull((cast(nullif((avg(datediff(minute,[Start_Date],End_Date)) % 1440) / 60, 0) as varchar(2)) + ' Hours, '), '')
       + isnull((cast(nullif(avg(datediff(minute,[Start_Date],End_Date)) % 60, 0) as varchar(2)) + ' Minutes'), '')
       as AvgTime
from @t;

select Category
      ,sum(case when [Status] = 'Won' then 1.0 else 0.0 end) / count([Status]) as [Won%]
      ,avg(datediff(minute,[Start_Date],End_Date)) as AvgTimeMins
      ,isnull((cast(nullif(avg(datediff(minute,[Start_Date],End_Date)) / 1440, 0) as varchar(5)) + ' Days, '), '')
       + isnull((cast(nullif((avg(datediff(minute,[Start_Date],End_Date)) % 1440) / 60, 0) as varchar(2)) + ' Hours, '), '')
       + isnull((cast(nullif(avg(datediff(minute,[Start_Date],End_Date)) % 60, 0) as varchar(2)) + ' Minutes'), '')
       as AvgTime
from @t
group by Category;

产出


+----------+-------------+--------------------------------+
|   Won%   | AvgTimeMins |            AvgTime             |
+----------+-------------+--------------------------------+
| 0.400000 |      369532 | 256 Days, 14 Hours, 52 Minutes |
+----------+-------------+--------------------------------+


+----------+----------+-------------+--------------------------------+
| Category |   Won%   | AvgTimeMins |            AvgTime             |
+----------+----------+-------------+--------------------------------+
| A        | 0.600000 |      378433 | 262 Days, 19 Hours, 13 Minutes |
| B        | 0.333333 |      354907 | 246 Days, 11 Hours, 7 Minutes  |
| C        | 0.000000 |      354278 | 246 Days, 38 Minutes           |
+----------+----------+-------------+--------------------------------+