2013-08-07 83 views
1

在此先感谢!获取日均特定日期范围的SQL Server

这是我到目前为止有:

我被人选择任务总量为给定日期范围内特定的所有者。我现在试图为每个人获得确切的每日任务平均数。

我遇到的问题是,它使平均结束返回.00,而不是确切的平均水平。例如,一个人一周可能有两项任务;我得到0.00的平均,而不是0.28或0.29

SELECT 
    convert(nvarchar, COUNT(p.personID)) AS count, 
    CONVERT(decimal(4, 2), COUNT(p.personID)/DATEDIFF(DAY, @startDate, @endDate)) AS average, 
    p.personID, 
    p.firstname, 
    p.lastname, 
    c.companyname 
FROM 
    Tasks t 
JOIN 
    Person p ON p.personID = t.personID 
JOIN 
    Client c ON c.id = p.employer 
JOIN 
    Commission m ON m.ClientID = c.ID 
WHERE 
    t.created BETWEEN @startDate AND @endDate 
    AND m.owner IN ('John Doe') 
GROUP BY 
    p.personID, p.firstname, p.lastname, c.companyname 
ORDER BY 
    c.companyname, count DESC 

回答

2

注意,如果结束日期和开始日期是相同的,你通过0误差得到了分工。

你的问题是,COUNT(p.personID)和DATEDIFF(DAY,@的startDate,@结束日期)都返回整数。当除2个整数时,你会得到第三个整数向下取整。通过乘以1.0你会得到一个十进制值。

CONVERT(decimal(4,2),1.0*COUNT(p.personID)/DATEDIFF(DAY,@startDate,@endDate)) 
+0

谢谢你的回答!它的工作原理,当我添加1.0时是否仍然需要将它转换为小数? – Klay

+0

声明“当分割2个整数时得到第三个整数向下取整”是rdbms特有的。这对于s​​ql server来说是正确的,但对于redbrick和oracle来说是错误的。我测试了这三个。由于该问题没有任何特定数据库引擎的标签,因此我认为值得一提。 –

+0

@DanBracuk标题说sqlserver。你是对的 –