假设我有一个表号:
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
上面的代码显然不正确吗?正确的方法是什么?
答案 0 :(得分:1)
SQL Server本身不支持用户定义的变量。如此说来,您可以使用window function
创建运行总和的结果相同:
select number, sum(frequency) over (order by number)
from yourtable
根据以下注释,如果您还需要上一个运行总和,则可以使用带有lag
和coalesce
的子查询:
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
中表达式的求值顺序。如果要解决此问题,请问另一个问题。