另一种方法是使用数字表(如果您还没有数字表,也可以自行创建)。假设您不能提供超过 255 剂:
DECLARE @Doses table
(
RowID int IDENTITY(1,1),
DateShipped date,
RemainingDoses tinyint,
RXDays tinyint
);
INSERT @Doses(DateShipped, RemainingDoses, RXDays)
VALUES('20190605',2,30),('20190704',3,24);
-- pseudo Numbers table
DECLARE @num table(n tinyint);
INSERT @num(n) SELECT TOP (256)
row_number() OVER (ORDER BY (SELECT NULL)) - 1
FROM sys.all_columns;
SELECT d.RowID, d.DateShipped, d.RemainingDoses, d.RXDays,
SubsequentShipdate = DATEADD(DAY, n.n*d.RXDays, d.DateShipped)
FROM @Doses AS d
INNER JOIN @num AS n
ON n.n <= d.RemainingDoses
ORDER BY d.RowID, SubsequentShipdate;
结果:
如果您只想要“下一个”日期而不包括原始行,只需添加:
AND n.n > 0
或者,不要在数字表中包含0(尽管它可能很有用):
INSERT @num(n) SELECT TOP (255)
row_number() OVER (ORDER BY (SELECT NULL))