如何在SQL Server中将局部变量分配给局部变量

时间:2018-08-15 02:59:24

标签: sql sql-server

假设我有一个表号:

number  frequency
1        6
2        2
3        8
4        5

在MySQL中,我们无需声明即可动态分配变量

select 
Number, 
@prev := @count as prevNumber, 
(@count := @count + Frequency) as countNumber
from Numbers

在SQL Server中,我们可以这样做吗?

我必须声明然后使用?

declare @prev int
declare @counts int
set @prev=0
set @counts=0

select number,
(@prev=@counts) as prevNumber,
(@counts=@counts+frquency) as countNumber from numbers

上面的代码显然不正确吗?正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

SQL Server本身不支持用户定义的变量。如此说来,您可以使用window function创建运行总和的结果相同:

select number, sum(frequency) over (order by number)
from yourtable

根据以下注释,如果您还需要上一个运行总和,则可以使用带有lagcoalesce的子查询:

select number, sum(prevnum) over (order by number) as prevNumber, countNumber
from (select *, coalesce(lag(frequency) over (order by number),0) as prevnum, 
                sum(frequency) over (order by number) as countNumber 
      from yourtable) t

这基本上只会创建多个运行总和,其中一个也等于前一个金额。

答案 1 :(得分:0)

sgeddes要说的特定语句是SQL Server中的SELECT语句可以为变量赋值,但不能同时执行。 MySQL代码同时完成了两者。

在SQL Server中,您将使用窗口函数来执行此操作。如果您希望运行总和不包括当前值,只需减去当前值即可:

select number,
       sum(frequency) over (order by number) as running_sum,
       (sum(frequency) over (order by number) - frequency) as running_prev_sum
from yourtable;

您还可以使用window子句:

sum(frequency) over (order by number rows between unbounded preceding and 1 preceding)

但是我发现这不仅累加而且不清楚,而不仅仅是减去当前值。

我还需要补充一点,就是不能保证您的MySQL能正常工作。 MySQL不保证SELECT中表达式的求值顺序。如果要解决此问题,请问另一个问题。