2017-03-14 24 views
4

可以说我有如下表:的时间差平均和分组在SQL

User | Date_start | Date_End | Task 
---------------------------------------- 
Al | 1/11/17 | 1/14/17 | Dishes 
Al | 1/09/17 | 1/15/17 | Paint 
Al | 1/11/17 | 1/14/17 | Dishes 
Al | 1/18/17 | 1/20/17 | Paint 
Todd | 1/11/17 | 1/14/17 | Dishes 
Al | 1/11/17 | 1/21/17 | Dishes 
Todd | 1/10/17 | 1/17/17 | Paint 
Todd | 1/11/17 | 1/14/17 | Dishes 
Todd | 1/11/17 | 1/14/17 | Paint 
Al | 1/11/17 | NULL  | Dishes 

我所试图做的是普通的日子在任务栏通过完成任务
并且清楚它们分组任务。但是,如果记录尚未完成(如'null'所示),我想从平均计算中排除此记录。此外,我试图通过任务对它们进行唯一计数(同样,忽略date_end'null'值的记录)。我希望得到一个输出像这样(下称“平均”数字是绝对关闭,仅用于演示):

User | Count_of_Task | AVG_Time_to_Finish_In_Days | Task 
----------------------------------------------------------- 
Al |  3  |   4.2    | Dishes 
Al |  2  |   4.0    | Paint 
Todd |  2  |   2.6    | Dishes 
Todd |  2  |   6.1    | Paint 

我使用下面的SQL:

Select s.user, 
    COUNT(s.task) as count_of_task, 
    AVG(DATEDIFF(dd,s.date_start,s.date_end)*1.0) as avg_time_to_finish_in_days, 
    s.task 
FROM dbo.stuff s 
WHERE S.DATE_END IS NOT null 
GROUP by s.task, 
    s.user 
HAVING AVG(DATEDIFF(dd,s.date_start,s.date_end)*1.0) <> 0 
    and COUNT(s.task) <> 0 

此SQL不正确地分组任务并截断平均时间完成,给我平均值为0的小数(即6.000000)。

我正在使用SQL Server 2014.

任何帮助将不胜感激!

+1

你使用的是mysql还是sql-server? –

+0

只是sql-server。我将删除另一个标签 –

+1

因此,您需要一个'WHERE Date_end IS NOT NULL'。 – user3741598

回答

1

简单地增加一个WHERE子句应足以

Select s.user, 
    COUNT(s.task) as count_of_task, 
    AVG(DATEDIFF(dd,s.date_start,s.date_end)*1.0) as avg_time_to_finish_in_days, 
    s.task 
FROM dbo.stuff s 
WHERE s.date_end IS NOT NULL -- this should be sufficient 
GROUP by s.task, s.user 

注意,在SQL Server中,你可以同时使用WHERE,并与GROUP BY HAVING。 WHERE在分组前和分组后HAVING。

+0

这让我感受到了大部分路程,谢谢! –

2
Declare @YourTable table ([User] varchar(25),Date_start date,Date_End date,Task varchar(25)) 
Insert Into @YourTable values 
('Al','1/11/17','1/14/17','Dishes'), 
('Al','1/09/17','1/15/17','Paint'), 
('Al','1/11/17','1/14/17','Dishes'), 
('Al','1/18/17','1/20/17','Paint'), 
('Todd','1/11/17','1/14/17','Dishes'), 
('Al','1/11/17','1/21/17','Dishes'), 
('Todd','1/10/17','1/17/17','Paint'), 
('Todd','1/11/17','1/14/17','Dishes'), 
('Todd','1/11/17','1/14/17','Paint'), 
('Al','1/11/17',NULL,'Dishes') 

Select [User] 
     ,Count_Of_Task = count(*) 
     ,AVG_Time_to_Finish_In_Days = convert(decimal(10,1),avg(datediff(DAY,Date_start,Date_End)+0.0)) 
     ,Task 
From @YourTable 
Where Date_End is not null 
Group By [User],Task 
Order by [User],Task 

返回

User Count_Of_Task AVG_Time_to_Finish_In_Days Task 
Al  3    5.3       Dishes 
Al  2    4.0       Paint 
Todd 2    3.0       Dishes 
Todd 2    5.0       Paint 
+0

谢谢你的帮助! –