谢谢
如何统计如下数据表1 a   数据01  1221222212122111121211122211222 
02  22222111121211111111111122222211111 
03  212121212111111112222212121221111222222 





................. 如和统计两个,3,4,。连续的次数
如22,或11,就是两连续222或222 就是3连续1111或2222就是4连续
11111或22222就是5连续
。。上面数据结果是
a   2连续  3连续  4连续。5。6。7。811。01   3次  2次 1次02   0次  0次 1次 2次 1次 0次 0次 0次 0次  1次------5的2次 6的1次 11的1次
03   1次  0次 1次 1次 1次 0次 1次 ----------------------------
另外能否分别统计
表1数据里数为1的,统计两个,3,4,。连续的次数
数为2的,统计两个,3,4,。连续的次数

解决方案 »

  1.   


    declare c_data cursor for select a,data from tb
    declare @tb table (a varchar(2),data varchar(30))
    declare @i int,@j int,@count int 
    declare @a varchar(10),@data varchar(100)
    open c_data
    fetch c_data into @a,@data
    while @@fetch_status=0
    begin
        select @j=1,@count=len(@data),@i=1
        while @j<=@count
         begin
         if substring(@data,@i,1)<> substring(@data,@i+1,1)
            begin
            insert into @tb select @a,substring(@data,1,@i)
            select  @data=stuff(@data,1,@i,''),@i=1
            end
         else
            select  @i=@i+1 ,@j=@j+1
         end
    fetch next from c_data into @a,@data
    end
    close c_data
    deallocate c_data
    --select a,连续次数= len(data),count(*) as  连续总数 into # from @tb group by a,len(data) order by a
    select * from #
    select a,连续2=max(case 连续次数 when 2 then 连续总数 end),连续3=max(case 连续次数 when 3 then 连续总数 end), 
             连续4=max(case 连续次数 when 4 then 连续总数 end)
    from # k
    group by k.a 后面的行列转换,就自己搞定吧。行列转换的方法,在精华贴里面找。(需要使用动态sql语句,上面的方法不合适。)
    a     连续2   连续3    连续4
    01 3 3 2
    02 NULL NULL 1
    03 1 NULL 1
      

  2.   

    -- 测试数据
    DECLARE @t TABLE(a VARCHAR(10),b VARCHAR(200))
    INSERT @t SELECT '01','1221222212122111121211122211222'
    UNION ALL SELECT '02','22222111121211111111111122222211111'
    UNION ALL SELECT '03','212121212111111112222212121221111222222'--为了方便转换为2000所以像以下这么写,如果只在2005下适用更简单
    DECLARE @n INT
    SELECT @n=MAX(LEN(b)) FROM @t --加这个为了效率考率,其实可以不要
    SET ROWCOUNT @n
    SELECT IDENTITY(INT, 1, 1) id INTO # FROM sysobjects,syscolumns
    SET ROWCOUNT 0-- 查询
    SELECT
        A.a,
        gcnt = PATINDEX(
    '%[^' + SUBSTRING(a.b, b.id, 1) + ']%',
    STUFF(a.b, 1, b.id, '') + 'a'),
    cnt = COUNT(*)
    INTO #re
    FROM @t A, # B
    WHERE SUBSTRING('a' + a.b, B.id, 1) <> SUBSTRING(a.b, B.id, 1)
    AND PATINDEX(
    '%[^' + SUBSTRING(a.b, b.id, 1) + ']%',
    STUFF(a.b, 1, b.id, '') + 'a') > 1
    GROUP BY A.a,
    PATINDEX(
    '%[^' + SUBSTRING(a.b, b.id, 1) + ']%',
    STUFF(a.b, 1, b.id, '') + 'a')
    ORDER BY 1, 2;DECLARE
    @s nvarchar(4000);
    SET @s = N'';
    SELECT
    @s = @s 
    + N',' + QUOTENAME(RTRIM(gcnt) + N'连续')
    + N'=SUM(CASE gcnt WHEN ' + RTRIM(gcnt)
    + N' THEN cnt ELSE 0 END)'
    FROM(
    SELECT DISTINCT
    gcnt
    FROM #re
    )A
    ORDER BY gcnt;
    EXEC(N'
    SELECT
    a' + @s + N'
    FROM #re
    GROUP BY a
    ');-- 删除临时表
    DROP TABLE #, #re;
    /*-- 结果:
    a                  2连续         3连续         4连续         5连续         6连续         8连续        12连续
    ---------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    01                   3           3           2           0           0           0           0
    02                   0           0           1           2           1           0           1
    03                   1           0           1           1           1           1           0(3 行受影响)
    --*/
      

  3.   

    declare c_data cursor for select a,data from tb
    declare @tb table (a varchar(2),data varchar(30))
    declare @i int,@j int,@count int 
    declare @a varchar(10),@data varchar(100)
    open c_data
    fetch c_data into @a,@data
    while @@fetch_status=0
    begin
        select @j=1,@count=len(@data),@i=1
        while @j<=@count
         begin
         if substring(@data,@i,1)<> substring(@data,@i+1,1)
            begin
            insert into @tb select @a,substring(@data,1,@i)
            select  @data=stuff(@data,1,@i,''),@i=1
            end
         else
            select  @i=@i+1 ,@j=@j+1
         end
    fetch next from c_data into @a,@data
    end
    close c_data
    deallocate c_data
    --select a,连续次数= len(data),count(*) as  连续总数 into # from @tb group by a,len(data) order by a
    select * from #
    select a,连续2=max(case 连续次数 when 2 then 连续总数 end),连续3=max(case 连续次数 when 3 then 连续总数 end), 
             连续4=max(case 连续次数 when 4 then 连续总数 end)
    from # k
    group by k.a 后面的行列转换,就自己搞定吧。行列转换的方法,在精华贴里面找。(需要使用动态sql语句,上面的方法不合适。)
    a     连续2   连续3    连续4
    01    3    3    2
    02    NULL    NULL    1
    03    1    NULL    1