none
累加问题,有没有办法每次查询都先where一次? RRS feed

  • 问题

  • declare @Table table(ScoreID int identity(1,1),Score int)
    
    insert @Table
    select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6
    
    declare @ScoreID int,@Score int
    select @ScoreID=0,@Score=0
    
    select @Score=@Score+Score,@ScoreID=case when @Score>=10 and @ScoreID=0 then ScoreID else @ScoreID end
    from @Table/* where @Score<=10*/--这条件不起作用,有没有办法令其起作用
    
    --其效果是将所有Score累加,如果累加值>=10时,取其ID,即:1+2+3+4>=10,对应的ScoreID=4
    --大家有没有其他办法代替(效率高的办法),因为where @Score<=10不起作用,所以会全表扫描令效率变低
    select @ScoreID
    2010年6月23日 8:04

答案

  • declare @Table table(ScoreID int identity(1,1),Score int)
    declare @ScoreID int
    insert @Table
    select 1 union all 
    select 2 union all 
    select 3 union all 
    select 4 union all 
    select 5 union all 
    select 6
    
    set @ScoreID=
    (
    select top 1 a.ScoreID
    from @Table a join @Table b 
    on a.ScoreID>=b.ScoreID
    group by a.ScoreID
    having SUM(a.Score)>=10
    order by a.ScoreID )
    
    select @ScoreID
    /*
    -----------
    4*/
    
    • 已标记为答案 SQL STUDIO 2010年6月24日 11:27
    2010年6月23日 8:24

全部回复

  • declare @Table table(ScoreID int identity(1,1),Score int)
    declare @ScoreID int
    insert @Table
    select 1 union all 
    select 2 union all 
    select 3 union all 
    select 4 union all 
    select 5 union all 
    select 6
    
    set @ScoreID=
    (
    select top 1 a.ScoreID
    from @Table a join @Table b 
    on a.ScoreID>=b.ScoreID
    group by a.ScoreID
    having SUM(a.Score)>=10
    order by a.ScoreID )
    
    select @ScoreID
    /*
    -----------
    4*/
    
    • 已标记为答案 SQL STUDIO 2010年6月24日 11:27
    2010年6月23日 8:24
  • --feixiangxxx的是正确的(我之前也用过这语句,后来放弃了),因为我的@Table是比较复杂的,不知会不会影响效率,毕景已经两次查询@Table,@Table其实是如下面函数dbo.fConst,row_number()可不是好东西(大开资)呀
    
    
    create function fConst(@ConstType int,@Const int,@Score int)
    returns table as
    return
    (
    	select *,RowIndex=row_number() over
    	(
    		order by
    		case when @Const>0 and @ConstType=0 then Const end desc,
    		case when @Score>0 and @ConstType=0 then Score end desc,
    			
    		case when @Const>0 and @ConstType=1 then Const end asc,
    		case when @Score>0 and @ConstType=1 then Score end asc,
    		ConstID asc
    	)
    	from tConst
    )
    
    select top 1 a.RowIndex
    from dbo.fConst(1,100,0) a join dbo.fConst(1,100,0) b
    on a.RowIndex>=b.RowIndex having sum(a.RowIndex)>=10
    2010年6月23日 9:58