从三个表中获取有时不匹配字段的记录

时间:2012-05-10 08:03:08

标签: sql sql-server tsql

我有一个容易回答的问题......

我有一个名为Projects的表,主键是ProjectId

第二个表名为ProjectResourcesProjectId为外键,加上用户和小时的字段(表示分配给项目的用户)

第三个表格为TimesheetEntries(用户用来记录用户实际工作的小时数),ProjectId为外键,字段为User

我需要显示projectId,BudgetedHours(来自ProjectResources表)和ActualHours(来自TimesheetEntries表)的记录;但是,我想在下列情况中包括:

  1. 用户已分配到该项目但未对其进行操作(在这种情况下,预算时间应为值,实际小时数应为零)

  2. 用户未被分配到该项目但仍然使用它(在这种情况下,BudgetedHours应该为零,而ActualHours应该有一个值)

  3. 一个用户都被分配到该项目并且已经开始工作(BudgetedHours和ActualHours都有值)

  4. 有人可以指示我使用T-SQL语句来获得这种结果吗?

2 个答案:

答案 0 :(得分: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

但我猜你的字段名称等等,所以你需要根据自己的领域进行调整。

答案 1 :(得分: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