直接上代码
DECLARE @tb table(id int,num INT,mat INT)
insert @tb select 1,8,1
insert @tb select 3,8,-1
insert @tb select 2,4,1
insert @tb select 6,7,-1
insert @tb select 4,3,1
insert @tb select 5,3,1
SELECT * FROM @tb
我要对这个表进行num字段的累计,有2个要求:
1.mat 字段必须为正才进行累计
2.要按id的顺序进行累计。
已经实现了要求1,目前在研究怎么实现2,这个必须要有!
我现在的代码:
declare @count INT set @count=0
update @tb SET @count=(CASE WHEN CONVERT(INT,mat)>0 THEN @count+num ELSE @count END ),num=@count
select * from @tb
------解决思路----------------------
update 中能用order by 吗???
------解决思路----------------------
--試試以下:
DECLARE @tb table(id int,num INT,mat INT)
insert @tb select 1,8,1
insert @tb select 3,8,-1
insert @tb select 2,4,1
insert @tb select 6,7,-1
insert @tb select 4,3,1
insert @tb select 5,3,1
SELECT * FROM @tb ORDER BY id
declare @count INT set @count=0;
WITH a1 AS
(
SELECT *,ROW_NUMBER() OVER (ORDER BY id) re FROM @tb
)
update @tb SET @count=(CASE WHEN CONVERT(INT,mat)>0 THEN @count+num ELSE @count END ),num=@count
select * from @tb ORDER BY id
------解决思路----------------------
DECLARE @tb table(id int,num INT,mat INT)
insert @tb select 1,8,1
insert @tb select 3,8,-1
insert @tb select 2,4,1
insert @tb select 6,7,-1
insert @tb select 4,3,1
insert @tb select 5,3,1
;WITH cte AS
(
select
n.id,
n.num,
sumnum=(SELECT SUM(CASE mat WHEN -1 THEN 0 ELSE num END) FROM @tb m WHERE m.id <= n.id) ,
n.mat
from @tb n
)
UPDATE cte
SET num = sumnum
SELECT * FROM @tb ORDER BY id
/*
id num mat
1 8 1
2 12 1
3 12 -1
4 15 1
5 18 1
6 18 -1
*/
------解决思路----------------------
WITH 通常与AS连用,也叫做子查询部分。用法:
1)可用来定义一个SQL片断,该片断会被整个SQL语句所用到。
2)为了让SQL语句的可读性更高
3)也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。
------解决思路----------------------
先用cte或者临时表,存放你需要更新的数据,然后再update原表。顺序这个东西在临时表或者CTE中先处理好即可
------解决思路----------------------
不建议update的时候去做排序,会影响性能
------解决思路----------------------
14W的话一次update消耗很大,特别是日志的增长量,如果不是实时操作,可以考虑用大容量日志模式来处理然后再恢复到完整模式,同时5000每次这样会快很多