如果有这样一个表
ID    VALUE1     VALUE2
1     china        25
2     china        23
3     usa          78
4     usa          75
5     china        40
6     china        30
我希望连续一段区间内进行汇总,得出这样一个结果china    48
usa      153
china    70因为china中间已经被Usa分割了,所以就要重新累计这样的需求应该怎样实现呢

解决方案 »

  1.   

    select VALUE1 huizong=(select max(VALUE2) from tb where VALUE1=a.VALUE1 and id=a.id+1) 
    from tb a
      

  2.   

    create table tx(id int identity primary key ,name varchar(10),c int);
    insert into tx select 'a',10
    union all select 'a',20 
    union all select 'b',10
    union all select 'a',20
    union all select 'a',10;select * from tx;with cte as 
    (
    select dr=DENSE_RANK() over(PARTITION by name order by id),rn=ROW_NUMBER() over(order by id),* from tx
    )
    select name,SUM(c) from cte group by rn-dr,name order by MIN(id)/*
    name       
    ---------- -----------
    a          30
    b          10
    a          30(3 行受影响)
    */
      

  3.   

    with cte as 
    (
        select dr=DENSE_RANK() over(PARTITION by name order by id),rn=ROW_NUMBER() over(order by id),* from tx
    )
    select name,SUM(c) from cte group by rn-dr,name order by MIN(id)
    没有看懂这条语句
      

  4.   

    2楼的语句的确不错。
    #1. 先生成一个缓存的结果集(CTE). 增加2列: 一列是按name分组后,在组内生成连续的序号;一列是按id排序后,用row_number函数生成记录号
    #2. 特别注意一下CTE生成的结果集,呵呵
    #3. 按rn-dr分组,再按name分组,求出组内c字段的和,再以组内最小的id来排序
    重点是在rn-dr,为什么这样分组没有问题呢?
    呵呵,自己捉摸一下吧。看一下#2中的结果集。
      

  5.   

    select value1,sum(value2) as value2
    from (
    select 
     row_number() over(partition by value1 order by id)-id as rn,
     value1,value2
    from tb )l
    group by value1,rn;
      

  6.   


    你在网上查下SQL 2005 的四个分组函数就知道了!