0

我有一个问题应该很容易回答...

我有一张表叫Projects,主键是ProjectId

第二个表被称为ProjectResourcesProjectId作为外键,加上用户和小时字段(代表分配给项目工作的用户)

第三个表是TimesheetEntries(用户用来记录用户在项目上实际工作的时间),ProjectId作为外键和字段User

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

  1. 一个用户被分配到该项目,但没有工作(在这种情况下,预算小时数应该有一个值,而实际小时数应该为零)

  2. 用户未分配到该项目,但仍对其进行了处理(在这种情况下,BudgetedHours 应该为零,ActualHours 应该有一个值)

  3. 一个用户既被分配到该项目并且已经在它上面工作(BudgetedHours 和 ActualHours 都有值)

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

4

2 回答 2

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
于 2012-05-10T14:43:00.457 回答
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

但我猜测您的字段名称等,因此您需要针对您自己的域进行调整。

于 2012-05-10T14:30:12.807 回答