我正在try 创建一个针对其自身结果运行的查询,直到结果满足我所寻找的结果.我需要编写SQL来告诉我下一行的第[ProjStart]个日期应该是基于前一行的第[ProjStart]个日期+前面的第[EffortDays]行,每个第[EmpName]行.每个任务的顺序基于由[EmpName]划分的[Position]列.诀窍在于,在查询告诉它具有前一行的[ProjStart]+[EffortDays]之前,并不是所有行都有日期.

以下是帮助创建所需结果的示例表

DECLARE @aTestTable TABLE  
     (  
        Position int,  
        EmpName   VARCHAR(10),  
        ProjStart  DATE,
        EffortDays int
     );  
  
 INSERT INTO @aTestTable VALUES 
 ('1', 'Adam', '2023-05-01',2),
 ('2', 'Adam', NULL,3), 
 ('3', 'Adam', NULL,1), 
 ('4', 'Adam', NULL,2), 
 ('5', 'Adam', NULL,4), 
 ('6', 'Adam', NULL,3), 
 ('1', 'Bill', '2023-05-07',4), 
 ('2', 'Bill', NULL,5), 
 ('3', 'Bill', NULL,1), 
 ('4', 'Bill', NULL,3), 
 ('5', 'Bill', NULL,6), 
 ('1', 'Bob', '2023-05-10',4),
 ('2', 'Bob', NULL,2),
 ('3', 'Bob', NULL,5),
 ('4', 'Bob', NULL,1),
 ('5', 'Bob', NULL,1),
 ('6', 'Bob', NULL,2),
 ('7', 'Bob', NULL,3),
 ('1', 'Dave', '2023-04-28',2),
 ('2', 'Dave', NULL,1),
 ('3', 'Dave', NULL,5),
 ('4', 'Dave', NULL,4)

 SELECT * FROM @aTestTable

如果我能提供澄清,请告诉我.

下面是预期的输出,取前面的行[ProjStart]并添加当前行[ProjStart]的前面的行[EffortDays],当前行[ProjStart][EmpName]分区并按[Position]排序.

Position    EmpName ProjStart   EffortDays
1   Adam    2023-05-01  2
2   Adam    2023-05-03  3
3   Adam    2023-05-06  1
4   Adam    2023-05-07  2
5   Adam    2023-05-09  4
6   Adam    2023-05-13  3
1   Bill    2023-05-07  4
2   Bill    2023-05-11  5
3   Bill    2023-05-16  1
4   Bill    2023-05-17  3
5   Bill    2023-05-20  6
1   Bob 2023-05-10  4
2   Bob 2023-05-14  2
3   Bob 2023-05-16  5
4   Bob 2023-05-21  1
5   Bob 2023-05-22  1
6   Bob 2023-05-23  2
7   Bob 2023-05-25  3
1   Dave    2023-04-28  2
2   Dave    2023-04-30  1
3   Dave    2023-05-01  5
4   Dave    2023-05-06  4

推荐答案

这里有一个解决方案,我认为它可以满足您的需求.

我使用CTE(Common Table Expression)首先检索填充了ProjStart的行,然后递归地将下一行的数据与前一组行的ProjStart和EffortDate组合在一起,为下一行生成ProjStart.

SQL:

DECLARE @aTestTable TABLE
(
    Position   INT,
    EmpName    VARCHAR(10),
    ProjStart  DATE,
    EffortDays INT
);
  
INSERT INTO @aTestTable VALUES
  (1, 'Adam', '2023-05-01', 2),
  (2, 'Adam', NULL, 3),
  (3, 'Adam', NULL, 1),
  (4, 'Adam', NULL, 2),
  (5, 'Adam', NULL, 4),
  (6, 'Adam', NULL, 3),
  (1, 'Bill', '2023-05-07', 4),
  (2, 'Bill', NULL, 5),
  (3, 'Bill', NULL, 1),
  (4, 'Bill', NULL, 3),
  (5, 'Bill', NULL, 6),
  (1, 'Bob', '2023-05-10', 4),
  (2, 'Bob', NULL, 2),
  (3, 'Bob', NULL, 5), 
  (4, 'Bob', NULL, 1),
  (5, 'Bob', NULL, 1),
  (6, 'Bob', NULL, 2),
  (7, 'Bob', NULL, 3),
  (1, 'Dave', '2023-04-28', 2),
  (2, 'Dave', NULL, 1),
  (3, 'Dave', NULL, 5),
  (4, 'Dave', NULL, 4)

;WITH mycte AS (
  SELECT Position, EmpName, ProjStart, EffortDays
  FROM   @aTestTable
  WHERE  ProjStart IS NOT NULL
  UNION ALL
  SELECT next.Position, next.EmpName, DATEADD(dd, prev.EffortDays, prev.ProjStart) AS ProjStart, next.EffortDays
  FROM   mycte       prev
  JOIN   @aTestTable next ON next.EmpName  = prev.EmpName
                         AND next.Position = prev.Position + 1
)
SELECT * FROM mycte
ORDER BY EmpName, Position

Results:

Position EmpName ProjStart EffortDays
1 Adam 2023-05-01 2
2 Adam 2023-05-03 3
3 Adam 2023-05-06 1
4 Adam 2023-05-07 2
5 Adam 2023-05-09 4
6 Adam 2023-05-13 3
1 Bill 2023-05-07 4
2 Bill 2023-05-11 5
3 Bill 2023-05-16 1
4 Bill 2023-05-17 3
5 Bill 2023-05-20 6
1 Bob 2023-05-10 4
2 Bob 2023-05-14 2
3 Bob 2023-05-16 5
4 Bob 2023-05-21 1
5 Bob 2023-05-22 1
6 Bob 2023-05-23 2
7 Bob 2023-05-25 3
1 Dave 2023-04-28 2
2 Dave 2023-04-30 1
3 Dave 2023-05-01 5
4 Dave 2023-05-06 4

Working demo fiddle:
http://sqlfiddle.com/#!18/1c3e5c/1/0

另外,我确实认为你们的员工应该在周末休息,但我们将把这一点留到另一个问题中go ;

Sql相关问答推荐

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

在甲骨文中查找前一个星期一的S日期

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

Select 非重复值并按条件排除行

将日期时间转换为日期格式

在MS Access Modern图表的X轴上显示时间值时遇到问题

动态组/转置

将两列相加为同一表中的行的查询

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

更改重复值的情况

替换SQL Server XML中多处出现的 node 值

SQL Server:时态表并在运行时添加计算列

SQL for Smarties 类型问题:从表中 Select 记录,并对某些值进行分组

获取记录的上一个值,并将其与当前值一起显示

PostgreSQL - 递归地聚合来自不同列的属性

在多个表上递归查找

Select 给定类别列表(或更多类别)中的所有事物

SQL查询以获取从特定可变日期看到的用户

运算符不存在:integer = bigint[]

在 sql 中合并系列以删除重复项