2012-05-10 79 views
0

我有,應該是很容易回答的問題......從三個表獲取記錄與有時不匹配字段

我有一個表叫Projects,主鍵是ProjectId

二表稱爲ProjectResources,與ProjectId作爲外鍵,加上(代表用戶分配到項目工作)的用戶數和小時領域

三表是TimesheetEntries(其中用戶使用記錄小時用戶實際進行的項目),與ProjectId爲外鍵,和現場User

所需要的是爲我展現projectId,BudgetedHours(從ProjectResources表中的記錄),並ActualHours(從TimesheetEntries表);不過,我想包括以下情況:

  1. 用戶被分配到該項目,但它沒有工作(在這種情況下,預算時間應該有一個值與實際時間應該是零)

  2. 用戶沒有分配給項目,但是,它仍然工作(在這種情況下BudgetedHours應該是零和ActualHours應該有一個值)

  3. 用戶既分配給項目和已經開始工作了(BudgetedHours和ActualHours都有值)

有人可以指示我到T-SQL語句來獲得這種結果嗎?

+0

您是否選擇了此答案?如果是這樣,你可以標記或回覆? – tonyellard

回答

0

你可以嘗試這樣的:

SELECT p.ProjectId, 
     (CASE WHEN pr.[User] Is NULL THEN te.[User] ELSE pr.[User] END) as [User], 
     IsNull(pr.BudgetedHours, 0.0), 
     IsNull(Sum(te.ActualHours), 0.0) 
FROM Project p 
LEFT JOIN ProjectResources pr on p.ProjectId = pr.ProjectId 
LEFT JOIN TimeSheetEntries te on p.p.ProjectId = te.ProjectId 
GROUP BY p.ProjectId, te.User, pr.BudgetedHours 

但我在你的字段名等猜測,所以你需要去適應這個爲自己的域名。

0

我認爲你有問題的原因是因爲你正在考慮實際的小時數和預算的小時數基本相等,因爲他們被分配到項目中。

但是,實際和預算是以非常不同的方式計算的。您需要使用單獨的子查詢計算它們,如下例所示:

select coalesce(budget.ProjectId, actual.ProjectId) as ProjectId, 
     budget.BudgetedHours, actual.ActualHours 
from 
(
    select projectid, sum(pr.hours) as BudgetedHours 
    from Projects p 
    left outer join ProjectResources pr 
) budget 
full outer join 
(
    select projectid, sum(tse.hours) as ActualHours 
    from Projects p 
    left outer join TimeSheetEntries tse 
    on tse.ProjectId = p.ProjectId 
) actual 
    on budget.ProjectId = actual.ProjectId 
相關問題