2010-08-03 72 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%

這是你想知道的嗎?