使用CTE计算多个列

时间:2011-06-17 12:36:50

标签: sql sql-server sql-server-2005

我对这个网站很新,对一切都很新。 我不知道问的方式。所以我之前问过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列数据。希望你能得到它。

多克

3 个答案:

答案 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)。