我在SQL DBA中有3列,即a和b以及rownumber。现在我的要求是我想为rownumber = 1计算a * b,结果将填充到rownumber = 2的列中并进行计算继续而不使用循环。 请帮忙,因为我在过去2个小时内一直处于困境之中
答案 0 :(得分:0)
在这里要做的最一般的事情(但不是最佳选择,具体取决于您使用的查询引擎/ SQL版本)将是计算a * b,然后将结果与原始表进行JOIN,将行号映射到行号-1
答案 1 :(得分:0)
在使用SQL Server 2012时,将可以使用便捷的LEAD
或LAG
函数。 LEAD
获取下一行的值,而LAG
获取前一行的值。
作为一个例子,看看:
declare @demo table (a int, b int, rownumber int)
insert into @demo VALUES
(2, 1, 1),
(4, 6, 2),
(4, 3, 3),
(5, 6, 4),
(2, 3, 5)
SELECT LAG(a * b) over(order by rownumber) as col1, rownumber
FROM @demo
结果:
col1 rownumber
NULL 1
2 2
24 3
12 4
30 5
您将能够将其粘贴到SSMS中的新查询窗口中并运行它。请注意,第一个结果为NULL。这是可以预期的,因为没有上一行。如果需要,可以使用COALESCE
(或在T-SQL ISNULL
中)来消除此问题。
请注意未来的SQL问题,我在这里做了什么:我提供了一个SQL语句,该语句创建具有正确列的表,还提供了一个插入语句以添加示例数据。以后请自己动手,因为这样可以节省志愿者的时间。然后,您只需要添加一些示例结果即可。
也请尝试在可能的地方编辑您的问题,而不要通过评论提供更多信息。这将再次使您的问题更容易理解和回答。通常,请花一些时间阅读有关如何提出问题的帮助部分。
答案 2 :(得分:0)
尝试使用它。...
; with cte as ( select a*b as res, row_number + 1 as Rownumber from table)
select t.a, t.b, c.res, t.rownumber from table as t inner join cte as c on t.rownumber=c.rownumber
在这里,您拥有所有3列,并且可以随意使用任何组合的记录。