计算平均时间和获胜百分比
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 |
+----------+----------+-------------+--------------------------------+
下面是我的数据库 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 |
+----------+----------+-------------+--------------------------------+