gpt4 book ai didi

sql-server - sql - 根据是 parent 还是 child 来计算列

转载 作者:行者123 更新时间:2023-12-04 05:15:28 25 4
gpt4 key购买 nike

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

例如在以下示例表中:

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 创建了一个表

谢谢,

我可以使用以下方法获得 parent :
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
)

最佳答案

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

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

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;

几个明显的优化浮现在脑海中。 ParentChildLoner 列是多余的,三者中的任何一个都可以去掉。 Parent 可以在汇总查询中通过 Max( R.Complete ) is not NULL 确定。 ChildLoner 的一个巧妙技巧目前让我无法理解。

关于sql-server - sql - 根据是 parent 还是 child 来计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14343465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com