2010-08-03 68 views
2

在我的模式中,我有一个表项目和一个表任务。每个项目都由任务组成。每个任务都有小时和百分比完成。为什么这个SQL SUM语句正确?

示例表:

 
ProjectID TaskID Hours PercentComplete 
1   1   100  50 
1   2   120  80 

我想获得的加权比例为完成该项目。我使用下面的SQL语句执行此操作:

SELECT P.ProjectID, P.ProjectName, SUM(T.Hours) AS Hours, 
SUM(T.PercentComplete * T.Hours)/100 AS CompleteHours, 
SUM(T.PercentComplete * T.Hours)/SUM(T.Hours) AS PercentComplete 
FROM Projects AS P INNER JOIN 
     Tasks AS T ON T.ProjectID = P.ProjectID 
WHERE  (P.ProjectID = 1) 

我的问题是有关声明的这一部分:

SUM(T.PercentComplete * T.Hours)/SUM(T.Hours) AS PercentComplete 

这让我对这个项目的正确加权百分比(在的情况下以上样本数据,66%)。但我似乎无法围绕为什么这样做。

此查询为何起作用?

+0

你不明白什么?你会如何试图写这个查询? – 2010-08-03 18:51:55

+0

我写了这个查询。我只是不知道为什么它给了我正确的结果。 – 2010-08-03 18:52:31

+3

在这里寻找整数数学。你真的想要得到舍入而不是准确的数字吗? – HLGEM 2010-08-03 18:57:16

回答

4
  • SUM(T.PercentComplete * T.Hours)/100总和为完整小时数。
  • SUM(T.Hours)是总小时数。
  • 这两个量的比率,即:

    (SUM(T.PercentComplete * T.Hours)/100)/SUM(T.Hours) 
    

    是小时内完成的比例(它应该和为0与1之间)。

  • 乘以100得出百分比。

我更喜欢将这样的百分比保留在数据库之外并将它们移动到表示层。如果数据库存储“完成时间”和“总时数”并且根本不存储百分比,那将会容易得多。计算中的额外因素100会混淆问题。

1

它通过累加对于每一行划分,然后他们在端

SUM(T.PercentComplete * T.Hours)

50* 100 + 
80 * 120 
------- 
14,600 

SUM的值分别计算两个和(T.Hours )

100 + 
120 
--- 
220 

然后分割末

14,600/220 
------------ 
66.3636 

编辑根据HLGEM的评论,由于整数除法,它实际上会返回66。

0

集合函数(如SUM())针对由GROUP BY子句定义的一组数据进行工作。所以,如果你通过ProjectID,ProjectName进行分组,那么这些功能将会按照它来分解。

0

peratiorn第一乘比列添加

(100* 50+ 120* 80)/(100+ 120) 
2

基本上你会发现在总共小时数内完成的小时数。

SUM(T.PercentComplete * T.Hours)计算您已完成的总小时数。 (100 * 50) = 50 * 100 + (120 * 80) = 146 * 100是分子。 146小时已经完成了这项工作,我们保持100乘数的百分比(因为它是[0-100],而不是[0-1]

然后,我们找到的总时数的工作,SUM(T.Hours),这是100 + 120 = 220

然后划分,我们找到加权平均值。 (146 * 100)/220 = 0.663636364 * 100 = 66.4%

这是你想知道的吗?