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であり、3 つのいずれかを削除できます。 によって要約クエリで決定できます。現時点で私のための巧妙なトリックまたはエスケープ.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 に答える