SQL-запрос - получить суммы с двух разных уровней иерархии - PullRequest
2 голосов
/ 07 апреля 2010

Проект имеет несколько задач, которые имеют несколько назначений

Проекты (1-n) -> Задачи (1-n) -> Задания

Поле в таблице «Задачи» - «Запланированные часы».

Поле в таблице назначений - «Назначенные часы».

Как получить запланированные и назначенные часы для всех проектов в одном запросе?

Ответы [ 2 ]

6 голосов
/ 07 апреля 2010

РЕДАКТИРОВАТЬ: Этот ответ дает неправильные результаты, но я оставлю его в исторических целях.

Я думаю, это поможет тебе. Я не могу понять, как избавиться от Distinct.

Select Distinct  
        Project.ProjectId,
        Sum(Task.PlannedHours) 
            Over (Partition By Project.ProjectId) As PlannedHours,
        Sum(Assignment.AssignedHours) 
            Over (Partition By Project.ProjectId) As AssignedHours
From Project 
    Inner Join Task On Project.ProjectId = Task.ProjectId   
    Inner Join Assignment On Task.TaskId= Assignment.AssignmentId

Вот мой тестовый скрипт.

Declare @Project Table (ProjectId Int)
Declare @Task Table (TaskId Int, ProjectId Int, PlannedHours Int)
Declare @Assignment Table (AssignmentId Int, TaskId Int, AssignedHours Int)

Insert Into @Project (ProjectId) values (1)
Insert Into @Project (ProjectId) values (2)
Insert Into @Project (ProjectId) values (3)

Insert Into @Task (TaskId, ProjectId, PlannedHours) values (1, 1, 10)
Insert Into @Task (TaskId, ProjectId, PlannedHours) values (2, 1, 10)
Insert Into @Task (TaskId, ProjectId, PlannedHours) values (3, 2, 11)
Insert Into @Task (TaskId, ProjectId, PlannedHours) values (4, 3, 12)

Insert Into @Assignment (AssignmentId, TaskId, AssignedHours) values (1, 1, 2)
Insert Into @Assignment (AssignmentId, TaskId, AssignedHours) values (2, 1, 2)
Insert Into @Assignment (AssignmentId, TaskId, AssignedHours) values (3, 2, 2)
Insert Into @Assignment (AssignmentId, TaskId, AssignedHours) values (4, 3, 3)

Select Distinct 
        Project.ProjectId,
        Sum(Task.PlannedHours) 
            Over (Partition By Project.ProjectId) As PlannedHours,
        Sum(Assignment.AssignedHours) 
            Over (Partition By Project.ProjectId) As AssignedHours   
From @Project Project 
    Inner Join @Task Task On Project.ProjectId = Task.ProjectId   
    Inner Join @Assignment Assignment On Task.TaskId= Assignment.AssignmentId
5 голосов
/ 07 апреля 2010
select p.ProjectID, t.PlannedHoursSum, a.AssignedHoursSum
from Projects p
inner join (
    select ProjectID, sum(PlannedHours) as PlannedHoursSum
    from Tasks
    group by ProjectID
) t on p.ProjectID = t.ProjectID
inner join (
    select t.ProjectID, sum(AssignedHours) as AssignedHoursSum
    from Tasks t
    inner join Assignments a on t.TaskID = a.TaskID
    group by t.ProjectID
) a on p.ProjectID = a.ProjectID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...