我对这个网站很新,对一切都很新。 我不知道问的方式。所以我之前问过1个问题(我把它作为答案发布)然后我再次发布了解决方案。你的所有想法都帮我解决了。
现在这里出现了新问题。
我想构建彼此计算的列。 (对不起我的英语不好) 例如:
Id Column1 Column2 Column3
1 5 5 => Same as Column1 5 => Same as Column2
2 2 12 => column1 current + column2.prev + column3.previous = 2+5+5 17 => column2.current + column3.prev = 12+5
3 3 32 => 3+12+17 49 => 32+17
更容易看到的方式:
Id Column1 Column2 Column3
1 5 5 => Same as Column1 5 => Same as Column2
2 2 12 => 2+5+5 17 => 12+5
3 3 32 => 3+12+17 49 => 32+17
这么复杂??? : - (
上一期是计算Column3,新计算列为Column2。但现在,它必须使用刚刚计算的Column2和Column3的前一个记录进行更新。如果您想查看上一篇文章here it is。
我期待任何答复,我们将不胜感激。提前谢谢
多克
首先,谢谢你们所有的想法。
我再次解释,原因尚不清楚。
这是我之前的递归CTE代码。它的工作方式类似于,1,在cteCalculation中使用当前列的先前记录(c.Column2)计算column2,然后使用cteCalculation中刚刚计算出的column2计算cte2中的新column3。
/从之前的帖子/
复制;with cteCalculation as (
select t.Id, t.Column1, t.Column1 as Column2
from table_1 t
where t.Id = 1
union all
select t.Id, t.Column1, (t.Column1 + c.Column2) as Column2
from table_1 t
inner join cteCalculation c
on t.Id-1 = c.id
),
cte2 as(
select t.Id, t.Column1 as Column3
from table_1 t
where t.Id = 1
union all
select t.Id, (select column2+1 from cteCalculation c where c.id = t.id) as Column3
from table_1 t
inner join cte2 c2
on t.Id-1 = c2.id
)
select c.Id, c.Column1, c.Column2, c2.column3
from cteCalculation c
inner join cte2 c2 on c.id = c2. id
现在我想扩展它,就像用彼此的数据计算2列一样。意味着,使用2nd来计算第3个,并使用3rd来获得新的第2列数据。希望你能得到它。
多克
答案 0 :(得分:1)
这是如何使用递归CTE
实现此目的的示例create table #tmp (id int identity (1,1), Column1 int)
insert into #tmp values(5)
insert into #tmp values(2)
insert into #tmp values(3);
with counter as
(
SELECT top 1 id, Column1, Column1 as Column2, Column1 as Column3 from #tmp
UNION ALL
SELECT t.id, t.Column1,
t.Column1 + counter.Column2 + counter.Column3,
(t.Column1 + counter.Column2 + counter.Column3) + counter.Column3 FROM counter
INNER JOIN #tmp t ON t.id = counter.id + 1
)
select * from counter
答案 1 :(得分:0)
您需要使用Recursive CTE,因为后续列的值取决于之前的结果。
也可以这样做。让您的第一个查询返回Column1
的正确值。您的下一个(递归CTE)查询将添加Column2
的结果,依此类推。
答案 2 :(得分:0)
好的我假设你在这里插入各种值的插入第1列。
基本上col2总是=新col1值+旧col2值+旧col3值 col3 =新col2值+旧col3值 所以col3 =(新col1值+旧col2值+旧col3值)+旧col3值
因此,INSTEAD OF Insert触发器可能是最简单的实现方式。
CREATE TRIGGER tr_xxxxx ON Tablename
INSTEAD OF INSERT
AS
INSERT INTO Tablename (Column1, Column2, Column3)
SELECT ins.col1, ins.col1+t.col2+t.col3, ins.col1+t.col2+t.col3+t.col3
FROM Tablename t INNER JOIN Inserted ins on t.Id = ins.Id
触发器可以访问Tablename t中的现有(旧)值以及要插入的新值(Inserted.col1)。