select level,[count]=(select sum([count]) from tb where level=a.level and [count]<=a.[count]) from tb a

解决方案 »

  1.   

    create table tb(Level varchar(10), [Count] int) 
    insert into tb values('Level1' ,     1 )
    insert into tb values('Level2' ,     3 )
    insert into tb values('Level3' ,     2 )
    insert into tb values('Level4' ,     5 )
    insert into tb values('Level5' ,     8 )
    goselect t.level ,
           [count] = (select sum([count]) from tb where level <= t.level)
    from tb tdrop table tb/*
    level      count       
    ---------- ----------- 
    Level1     1
    Level2     4
    Level3     6
    Level4     11
    Level5     19(所影响的行数为 5 行)*/
      

  2.   

    declare @ table(Level varchar(10),     [Count] int)
    ------    ------ 
    insert @ select 'Level1' ,     1 
    insert @ select 'Level2'  ,    3 
    insert @ select 'Level3'   ,   2 
    insert @ select 'Level4'    ,  5 
    insert @ select 'Level5'     , 8 select level,[count]=(select sum([count]) from @ where Level<=a.Level) from @ alevel      count
    ---------- -----------
    Level1     1
    Level2     4
    Level3     6
    Level4     11
    Level5     19(5 行受影响)
      

  3.   


    补充问题:
    1)在用level <= t.level的时候,这个表达式能否正确运算跟level的数据类型无关吗?
    2)请解释一下,比如轮到统计原表第一第二这前两条记录的时候,按照您写的SQL语句,数据库引擎内部是怎样执行的?
    3)请问:这个问题用递归函数可以实现吗,如何实现?谢谢,分数不够请说声,会加分!
      

  4.   

    1.随了text,image等类型的
    2.内部的还没研究,总之它是按左边的行逐行统计
    3.觉得没多大必要,除非使用频率很高。
      

  5.   

    --创建测试数据:
    create table tb(Level varchar(10), [Count] int) 
    insert into tb values('Level1' ,     1 )
    insert into tb values('Level2' ,     3 )
    insert into tb values('Level3' ,     2 )
    insert into tb values('Level4' ,     5 )
    insert into tb values('Level5' ,     8 )
    go
    --创建函数:
    create function getsum(@a varchar(20))
    returns int
    as
    begin
      declare @n int
      select @n=sum([count]) from tb where @a>=level
      return (@n)
    end
    go--查询:
    select level ,[count],[counts] = dbo.getsum(level) from tb--结果:
    /*
    level      count       counts
    ---------- ----------- -----------
    Level1     1           1
    Level2     3           4
    Level3     2           6
    Level4     5           11
    Level5     8           19(5 行受影响)
    */
    drop table tb --删除测试表
    drop function getsum --删除测试函数