我有一个容易回答的问题......
我有一个名为Projects
的表,主键是ProjectId
。
第二个表名为ProjectResources
,ProjectId
为外键,加上用户和小时的字段(表示分配给项目的用户)
第三个表格为TimesheetEntries
(用户用来记录用户实际工作的小时数),ProjectId
为外键,字段为User
我需要显示projectId,BudgetedHours
(来自ProjectResources
表)和ActualHours
(来自TimesheetEntries
表)的记录;但是,我想在下列情况中包括:
用户已分配到该项目但未对其进行操作(在这种情况下,预算时间应为值,实际小时数应为零)
用户未被分配到该项目但仍然使用它(在这种情况下,BudgetedHours应该为零,而ActualHours应该有一个值)
一个用户都被分配到该项目并且已经开始工作(BudgetedHours和ActualHours都有值)
有人可以指示我使用T-SQL语句来获得这种结果吗?
答案 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