高分请问,一个sql语句的有关问题

高分请教,一个sql语句的问题
有表如下
userid       count      useFlag
1                20            0
2               10             1
1                2              1
1               35             0
2               6               0
3               3               1

需求:
1、筛选 userid= @userid,且useFlag为0的记录前N条记录,计算出count总和,同时把这些记录的useFlag设为0
2、如果中途出错,则回滚


另外的问题:
select 会影响@@ERROR吗?


------解决思路----------------------
2008+可以直接
update top (N) tablename set ...
where ...


useFlag为0的记录.............................useFlag设为0
是否笔误

select 会影响@@ERROR

------解决思路----------------------
declare @userid int 
declare @n int 
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0'
)  as a

这些记录的userFlag都是0还怎么更新为‘0’
------解决思路----------------------
引用:
Quote: 引用:

declare @userid int 
declare @n int 
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0'
)  as a

这些记录的userFlag都是0还怎么更新为‘0’

应该是更新为1,写错了

这个是可以更新的,再加一个更新语句。只不过你是按什么字段排序的,不同字段排序,查询的前多少条的数据是不一样的。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

declare @userid int 
declare @n int 
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0'
)  as a

这些记录的userFlag都是0还怎么更新为‘0’

应该是更新为1,写错了

这个是可以更新的,再加一个更新语句。只不过你是按什么字段排序的,不同字段排序,查询的前多少条的数据是不一样的。


更新加求和功能的完整语句怎么写呢?

得分两次写~
另外,如reenjie TOP需要依据一定的排序,  否则你每次执行都可能结果都不一样~
------解决思路----------------------

试试这个
declare  @userid int=1, @n int=1,@sum int,@sql varchar(max)
begin tran
;with cte as 
( select count,useflag  from (select top (@n) *  from  tt  
 where userid=@userid and useflag!=0
 order by count) as t)
 select @sum=SUM(count) from cte
 print @sum
 update top (@n) tt 
set useflag =1 
where userid=1 and useflag=0
end

 

------解决思路----------------------
"筛选 userid= @userid,且useFlag为0的记录前N条记录"
--> 请问前N条记录的排序规则是什么?
------解决思路----------------------
引用:
Quote: 引用:

"筛选 userid= @userid,且useFlag为0的记录前N条记录"
--> 请问前N条记录的排序规则是什么?


数据库还有一个插入时间、一个bigint的自增长ID,可以按时间排序,也可以按自增长ID排序,都可以

1、统计数据
2、统计后把useFlag置为1

以ID排序為例

declare @userid int 
declare @n int 
set @userid=1
set @n=10
select sum([count]) from (
select top(@n) * from tablename where userid= @userid and useFlag='0' order by ID
)  as a
update tablename set useFlag='1' where  ID in  (select top(@n) ID from tablename where userid= @userid and useFlag='0' order by ID)