SQL平均子查询

时间:2019-07-11 17:39:14

标签: sql sql-server database

这对于日常的数据库专家来说可能微不足道... 我不是这个角色。因此,我们将不胜感激。

我有一个系统来捕获项目的创建和完成日期(称其为任务)。我想知道哪些任务需要花费最长的时间才能完成,而且通常是平均完成时间。

理想的输出:

Task Name | Average Completion Time
----------------------------------------------------

表格:

•任务表 •清单表(任务集)    o清单包含创建日期(当还创建了其中的所有任务时) •任务实例(对任务的引用)    o实例包含完成日期

我可以从已完成的任务实例中获取DATEDIFF(天数,清单,创建的清单,taskinstance.completed)。

我的结果是这样的:

Task 1 | 3 days
Task 1 | 10 days
Task 1 | 5 days
Task 2 | 2 days
Task 2 | 12 days
select t.[Description], ci.CreatedDateTime, cit.CompletedDateTime, DATEDIFF(day, ci.CreatedDateTime, cit.CompletedDateTime) as 'Days'
from checklistinstancetask cit
join checklistinstance ci on ci.Id = cit.ChecklistInstanceId
join Task t on t.Id = cit.TaskId
where cit.IsActive <> 0 
order by 'Days' desc

我想汇总任务并获得我从DATEDIFF返回的报告的平均值,因此它应该给我:

任务1 | 6天 任务2 | 7天

任何有关此查询的帮助都将非常棒。

2 个答案:

答案 0 :(得分:1)

您需要GROUP BY

select t.[Description],
       avg(1.0 * datediff(day, ci.CreatedDateTime, cit.CompletedDateTime)) as Days
from checklistinstancetask cit join
     checklistinstance ci
     on ci.Id = cit.ChecklistInstanceId join
     Task t
     on t.Id = cit.TaskId
where cit.IsActive <> 0 
group by t.[Description]
order by Days desc;

答案 1 :(得分:0)

我进行了此查询,但不确定是否最佳:

SELECT Results.Task, AVG(T1.Days) as 'Average Completion Time'
FROM   
(SELECT t.[Description] as 'Task', DATEDIFF(day, ci.CreatedDateTime, cit.CompletedDateTime) as 'Days'
from checklistInstanceTask cit
join checklistInstance ci on ci.Id = cit.ChecklistInstanceId
join Task t on t.Id = cit.TaskId
where cit.CompletedStatusId <> 0
) as [Results]
GROUP BY Results.Task
ORDER BY 'Average Completion Time' DESC