谢谢
如何统计如下数据表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 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,。连续的次数
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
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 行受影响)
--*/
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