2

我希望在某些条件下获得列的总和,即取决于列是具有子任务的父级还是没有子任务的父级。如果一个任务是子任务的父级,我只想要子任务的“完整”列的总和。如果一个任务只是一个父级,我只想要父级的完整列的总和。- 但仅当任务(父或子)都与同一用户相关时。

例如在以下示例表中:

UserID | Parent_TaskID | TaskID  | Complete
------ | ------------- | ------  | --------
435    | 149329        | 161280  |   1
435    | 149330        | 210717  |   2
435    | 149330        | 228100  |   3
435    | 156991        | 149330  |   1
169    | 458764        | 546540  |   2
169    | 456842        | 546541  |   2
169    | 456842        | 458764  |   0

TaskID 149330 是具有子 210717 和 228100 的父级,因此 149330 的该列的计数为 5,即忽略父级的完整列。161280 是父级,因此只会返回 0。546540 是 458764 的子任务,因此 458764 的总和为 2。

所以我认为我的结果应该是这样的:

TaskID  |  Sum_complete
------- |  ------------
161280  |  1
149330  |  5
546541  |  2
458764  |  2

任何想法如何做到这一点?

我在 SqlFiddle http://sqlfiddle.com/#!2/8295f创建了一个表

谢谢,

我可以通过以下方式获得父母:

select t.taskID, t.Parent_taskID, t.userID, t.complete 
from task t
where t.Parent_taskID not in (
    select tp.taskID
    from task tp
    where tp.userID = t.userID 
)
4

2 回答 2

3

根据您的描述,我认为您要求以下内容(使用问题中的示例数据):

编辑:替换查询以从结果集中消除子项。

declare @Task as Table
  ( UserId varchar(6), Parent_TaskId varchar(13), TaskId varchar(6), Complete integer );

INSERT INTO @Task ( UserId, Parent_TaskId, TaskId, Complete ) VALUES
    ('435', '149329', '161280', 1 ),
    ('435', '149330', '210717', 2 ),
    ('435', '149330', '228100', 3 ),
    ('435', '156991', '149330', 1 ),
    ('169', '458764', '546540', 2 ),
    ('169', '456842', '546541', 2 ),
    ('169', '456842', '458764', 0 );

; with QualifiedTasks as (
  select UserId, TaskId, Parent_TaskId, Complete,
    case when exists ( select 42 from @Task where Parent_TaskId = O.TaskId ) then 1 else 0 end as Parent,
    case when exists ( select 42 from @Task where O.Parent_TaskId = TaskId ) then 1 else 0 end as Child, -- Unused, but here for completeness.
    case when not exists ( select 42 from @Task where Parent_TaskId = O.TaskId or O.Parent_TaskId = TaskId ) then 1 else 0 end as Loner  
    from @Task as O )
  select L.TaskID, Sum( Coalesce( R.Complete, L.Complete ) ) as Sum_Complete
    from QualifiedTasks as L left outer join
      QualifiedTasks as R on R.Parent_TaskId = L.TaskId and R.UserId = L.UserId
    where L.Parent = 1 or L.Loner = 1
    group by L.TaskId;

一些明显的优化浮现在脑海中。、和列是多余的Parent,可以消除这三个中的任何一个。 可以在摘要查询中由 确定。一个聪明的把戏,或者现在让我逃脱了。ChildLonerParentMax( R.Complete ) is not NULLChildLoner

于 2013-01-15T18:02:37.417 回答
0

这应该有效(尽管您在问题上发布的数据与小提琴上的数据不同):

SELECT ISNULL(B.taskId,A.TaskId) TaskId, SUM(A.Complete) Complete
FROM Task A
LEFT JOIN Task B
ON A.Parent_TaskID = B.taskId
GROUP BY ISNULL(B.taskId,A.TaskId)
于 2013-01-15T17:52:14.277 回答