SQL Server T-SQL根据行值之间的差异使用计算数据动态填充列

wljmcqd8  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(105)

我正纠结于以下问题(简化形式)。我有一个53行的表,对于[天数]列,只有一些行包含数量。在[计算天数]列中,我想动态计算不包含数量的行的天数。将有数量的两行之差在没有数量的行中平均相加。如果没有差异,则使用相同的数量。
第一行有数量之前没有数量的行,填入该行数量;最后一行有数量之后没有数量的行,填入该行数量。
我的来源是前2列,我需要添加第3列。
| 周期编号|天数|计算天数|
| - ------|- ------|- ------|
| 1个|零|七十七|
| 第二章|零|七十七|
| 三个|零|七十七|
| 删除了一些行|零|七十七|
| 二十二|七十七|七十七|
| 二十三|零|七十五、八十三|
| 二十四|零|七十四、六十六|
| 二十五|零|七十三、四十九|
| 二十六|零|七十二、三十二|
| 二十七|零|七十一、十五|
| 二十八|七十|七十|
| 二十九|零|七十|
| 删除了一些行|零|七十|
| 四十五|七十|七十|
| 四十六|零|七十三、五十|
| 四十七|七十七|七十七|
| 四十八|零|七十七|
| 删除了一些行|零|七十七|
| 五十三|七十七|七十七|
我试着用排序和可能的条件来解决这个问题,但还不能完全正确,我觉得还有更好的方法。
任何正确方向的指导都非常感谢!

omjgkv6w

omjgkv6w1#

CREATE TABLE testTable (PeriodNo INT, NoOfDaysPL MONEY);
INSERT INTO dbo.testTable(PeriodNo)
SELECT TOP(53)ROW_NUMBER() OVER (ORDER BY t1.object_id) AS N
FROM sys.all_columns t1
     CROSS JOIN sys.all_columns AS t2;
UPDATE dbo.testTable SET NoOfDaysPL=77 WHERE PeriodNo=22;
UPDATE dbo.testTable SET NoOfDaysPL=70 WHERE PeriodNo=28;
UPDATE dbo.testTable SET NoOfDaysPL=70 WHERE PeriodNo=45;
UPDATE dbo.testTable SET NoOfDaysPL=77 WHERE PeriodNo=51;

SELECT PeriodNo, NoOfDaysPL, 
    CASE WHEN pv IS NULL THEN COALESCE(NoOfDaysPL, ndv)
         WHEN nv IS NULL THEN COALESCE(NoOfDaysPL, pdv)
         WHEN NoOfDaysPL IS NULL THEN pdv-((pdv-ndv)/(nv-pv)*(PeriodNo-pv))
         ELSE NoOfDaysPL 
    END NoOfDaysCalculated
FROM dbo.testTable AS tt
     CROSS APPLY(SELECT MAX(PeriodNo)
                 FROM dbo.testTable AS tt2
                 WHERE tt2.PeriodNo<tt.PeriodNo AND tt2.NoOfDaysPL IS NOT NULL) p(pv)
     CROSS APPLY(SELECT MIN(PeriodNo)
                 FROM dbo.testTable AS tt2
                 WHERE tt2.PeriodNo>tt.PeriodNo AND tt2.NoOfDaysPL IS NOT NULL) n(nv)
     OUTER APPLY(SELECT NoOfDaysPL FROM dbo.testTable AS tt2 WHERE tt2.PeriodNo=p.pv) pc(pdv)
     OUTER APPLY(SELECT NoOfDaysPL FROM dbo.testTable AS tt2 WHERE tt2.PeriodNo=n.nv) nc(ndv);

| 周期编号|天数PL|计算天数|
| - ------|- ------|- ------|
| 1个|* 无效 |七万七千|
| 第二章|
无效 |七万七千|
| 三个|
无效 |七万七千|
| 四个|
无效 |七万七千|
| 五个|
无效 |七万七千|
| 六个|
无效 |七万七千|
| 七|
无效 |七万七千|
| 八个|
无效 |七万七千|
| 九|
无效 |七万七千|
| 十个|
无效 |七万七千|
| 十一|
无效 |七万七千|
| 十二|
无效 |七万七千|
| 十三|
无效 |七万七千|
| 十四|
无效 |七万七千|
| 十五|
无效 |七万七千|
| 十六|
无效 |七万七千|
| 十七|
无效 |七万七千|
| 十八|
无效 |七万七千|
| 十九|
无效 |七万七千|
| 二十个|
无效 |七万七千|
| 二十一|
无效 |七万七千|
| 二十二|七万七千|七万七千|
| 二十三|
无效 |七十五点八三三四|
| 二十四|
无效 |七十四点六六六八|
| 二十五|
无效 |七十三点五零零二|
| 二十六|
无效 |七二三三三六|
| 二十七|
无效 |小行星71|
| 二十八|七万|七万|
| 二十九|
无效 |七万|
| 三十|
无效 |七万|
| 三十一|
无效 |七万|
| 三十二|
无效 |七万|
| 三十三|
无效 |七万|
| 三十四|
无效 |七万|
| 三十五|
无效 |七万|
| 三十六|
无效 |七万|
| 三十七|
无效 |七万|
| 三十八|
无效 |七万|
| 三十九|
无效 |七万|
| 四十|
无效 |七万|
| 四十一|
无效 |七万|
| 四十二|
无效 |七万|
| 四十三|
无效 |七万|
| 四十四|
无效 |七万|
| 四十五|七万|七万|
| 四十六|
无效 |小行星71|
| 四十七|
无效 |小行星72.3332|
| 四十八|
无效 |七十三四千九百九十八|
| 四十九|
无效 |七十四点六六六四|
| 五十|
无效 |七十五点八三三○|
| 五十一|七万七千|七万七千|
| 五十二|
无效 |七万七千|
| 五十三|
无效 *|七万七千|
fiddle

相关问题