【发布时间】:2018-09-17 13:21:51
【问题描述】:
我有一个任务表,我想在其中创建一个可以执行以下操作的视图: 1. 遍历每一行 2. 将开始日期和结束日期之间的每一天分解成一个新行 3. 在新列中插入平均任务工时
这是桌子:
CREATE TABLE #InputTABLE
(
TaskID varchar (200),
startdate DATETIME,
enddate DATETIME,
TaskWork int
)
INSERT INTO #InputTABLE VALUES('2298aas','2018-06-06','2018-06-12',200);
到目前为止,我已经解决了 2 和 3,但我在迭代部分真的很挣扎。如果 InputTABLE 中存在多于一行,则以下代码将失败:
CREATE TABLE #OutputTABLE
(
TaskID varchar (200),
startdate DATETIME,
enddate DATETIME,
TaskWork int
)
DECLARE @taskid varchar (200)
DECLARE @cnt int
DECLARE @startDate datetime
DECLARE @endDate datetime
DECLARE @incr int
DECLARE @tempDate datetime
DECLARE @work int
DECLARE @averagework int
SET @taskid=(Select TaskID from #InputTABLE)
SET @startDate=(Select startdate from #InputTABLE)
SET @endDate=(Select enddate from #InputTABLE)
SET @cnt=DATEDIFF(dy,@startDate,@endDate)
SET @incr=0
SET @tempDate=DATEADD(dy,@incr,Cast(@startDate As datetime))
SET @work=(Select TaskWork from #InputTABLE)
SET @averagework= @work/@cnt
WHILE @cnt>=0
BEGIN
IF @cnt = 0
BEGIN
INSERT INTO #OutputTABLE VALUES(@taskid,@tempDate,@endDate,@averagework);
END
ELSE
BEGIN
insert into #OutputTABLE values(@taskid,@tempDate,DATEADD(dy, DATEDIFF(dy,0,@tempDate)+1, -1),@averagework);
END
SET @tempDate=DATEADD(dy,@incr+1,DATEADD(dy,DATEDIFF(dy,0,@startDate),0))
SET @cnt=@cnt-1
SET @incr=@incr+1
END
我考虑过使用来自this 的光标来实现该解决方案,但我不确定该怎么做? cmets 也担心循环遍历行对性能不利,因此非常感谢任何关于此的建议!
表格大约有 15.000 行,平均日期范围大约是 31 天,因此视图大约有 465.000 行。不是一个很高的数字,但表格在不断增长,所以我可能还需要将视图限制为仅过去两年。
【问题讨论】:
-
这很清楚,但我认为包含一些示例数据和您想要的结果会非常有帮助。我认为
iterating通过你的桌子的想法是错误的。通过使用日历表并加入,有更好的方法可以实现我认为您所追求的目标。 The answer here with the integer table is close 但date table would be better in this case, I believe
标签: tsql database-cursor