sql2000统计问题,新手问题 谢谢问题1表1中如下。求数据列中每次出现为0的间隔数,然后统计次数表1id 数据
1  2
2  -7
3  4
4  5
5  0------------这里出现0,前面有4条数据,就是间隔4
6  1
7  3
8  0------------这里出现0,前面有2条数据,就是间隔2
9  0------------这里出现0,前面有0条数据,就是间隔0
10 1
11 9
...........得表2
      0    1    2    3    4。n
间隔  1次  0次  1次  0次  1次n次
问题2,是否能把数据列中每次出现0前面的数据全部相加,在罗列出次数?
表1id 数据
1  2
2  -7
3  4
4  5
5  0------------这里出现0,前面有4条数据相加是4,
6  1
7  3
8  0------------这里出现0,前面有2条数据相加是4
9  0
10 1
11 9
12 -15
13 0------------这里出现0,前面有3条数据相加是-5
...........得表2
             -5  -4  ..........4............n
到0的数据和  1次  0次  0次  0次  2次n次

解决方案 »

  1.   

    --问题1:
    DECLARE @TB TABLE([id] INT, DATA INT)
    INSERT @TB 
    SELECT 1, 2 UNION ALL 
    SELECT 2, -7 UNION ALL 
    SELECT 3, 4 UNION ALL 
    SELECT 4, 5 UNION ALL 
    SELECT 5, 0 UNION ALL 
    SELECT 6, 1 UNION ALL 
    SELECT 7, 3 UNION ALL 
    SELECT 8, 0 UNION ALL 
    SELECT 9, 0 UNION ALL 
    SELECT 10, 1 UNION ALL 
    SELECT 11, 9
    SELECT ID, ID-ISNULL((SELECT MAX(ID) 
    FROM @TB T1 
    WHERE T1.ID<T.ID AND T1.DATA=0), 0)-1 AS COL
    FROM @TB AS T
    WHERE DATA=0
    /*
    ID          COL
    ----------- -----------
    5           4
    8           2
    9           0
    */
      

  2.   

    --2:
    DECLARE @TB TABLE([id] INT, DATA INT)
    INSERT @TB 
    SELECT 1, 2 UNION ALL 
    SELECT 2, -7 UNION ALL 
    SELECT 3, 4 UNION ALL 
    SELECT 4, 5 UNION ALL 
    SELECT 5, 0 UNION ALL 
    SELECT 6, 1 UNION ALL 
    SELECT 7, 3 UNION ALL 
    SELECT 8, 0 UNION ALL 
    SELECT 9, 0 UNION ALL 
    SELECT 10, 1 UNION ALL 
    SELECT 11, 9 UNION ALL 
    SELECT 12, -15 UNION ALL 
    SELECT 13, 0
    SELECT ID, (SELECT SUM(DATA) 
    FROM @TB T2
    WHERE T2.ID BETWEEN ISNULL((SELECT MAX(ID) FROM @TB T1 WHERE T1.ID<T.ID AND T1.DATA=0), 0)+1 AND T.ID) AS COL
    FROM @TB AS T
    WHERE DATA=0
    /*
    ID          COL
    ----------- -----------
    5           4
    8           4
    9           0
    13          -5
    */
      

  3.   

    --> --> (Roy)生成測試數據
    set nocount on; 
    if not object_id('Tempdb..#1') is null
    drop table #1
    Go
    Create table #1([id] int,[数据] int)
    Insert #1
    select 1,2 union all
    select 2,-7 union all
    select 3,4 union all
    select 4,5 union all
    select 5,0 union all
    select 6,1 union all
    select 7,3 union all
    select 8,0 union all
    select 9,0 union all
    select 10,1 union all
    select 11,9 union all
    select 12,-15 union all
    select 13,0
    Go
    --问题1
    if OBJECT_ID('Tempdb..#t') is not null
    drop table #t
    select a.ID,COUNT(b.ID) as con
    into #t
    from (select a.id,isnull(max(b.ID),0) as ID2 from #1 as a left join #1 as b on b.id<a.ID and b.[数据]=0 where a.数据=0 group by a.ID)a
    inner join #1 as b on b.ID>a.ID2 and b.ID<a.ID
    group by a.ID--动态行转列declare @s nvarchar(4000),@i nvarchar(2),@j nvarchar(2)
    select @j=MAX(con),@i=0 from #t
    while @i<[email protected]
    select @s=isnull(@s+',','select ')+QUOTENAME(@i)+'=sum(case when con='[email protected]+' then 1 else 0 end)',@[email protected]+1
    exec(@s+' from #t')
    /*
    0 1 2 3 4
    0 0 1 1 1
    */
    go

    --问题2
    if OBJECT_ID('Tempdb..#t2') is not null
    drop table #t2
    select a.ID,sum(b.[数据]) as Total
    into #t2
    from (select a.id,isnull(max(b.ID),0) as ID2 from #1 as a left join #1 as b on b.id<a.ID and b.[数据]=0 where a.数据=0 group by a.ID)a
    inner join #1 as b on b.ID>a.ID2 and b.ID<a.ID
    group by a.ID
    --动态行转列declare @s nvarchar(4000),@i int,@j int
    select @i=MIN(Total),@j=MAX(Total) from #t2
    while @i<[email protected]
    select @s=isnull(@s+',','select ')+QUOTENAME(@i)+'=sum(case when Total='+rtrim(@i)+' then 1 else 0 end)',@[email protected]+1exec(@s+'from #t2 ')
    /*
    -5 -4 -3 -2 -1 0 1 2 3 4
    1 0 0 0 0 0 0 0 0 2
    */
      

  4.   

    在结果集加一上"次"
    --> --> (Roy)生成測試數據
    set nocount on; 
    if not object_id('Tempdb..#1') is null
    drop table #1
    Go
    Create table #1([id] int,[数据] int)
    Insert #1
    select 1,2 union all
    select 2,-7 union all
    select 3,4 union all
    select 4,5 union all
    select 5,0 union all
    select 6,1 union all
    select 7,3 union all
    select 8,0 union all
    select 9,0 union all
    select 10,1 union all
    select 11,9 union all
    select 12,-15 union all
    select 13,0
    Go
    --问题1
    if OBJECT_ID('Tempdb..#t') is not null
    drop table #t
    select a.ID,COUNT(b.ID) as con
    into #t
    from (select a.id,isnull(max(b.ID),0) as ID2 from #1 as a left join #1 as b on b.id<a.ID and b.[数据]=0 where a.数据=0 group by a.ID)a
    inner join #1 as b on b.ID>a.ID2 and b.ID<a.ID
    group by a.ID--动态行转列declare @s nvarchar(4000),@i nvarchar(2),@j nvarchar(2)
    select @j=MAX(con),@i=0 from #t
    while @i<[email protected]
    select @s=isnull(@s+',','select ')+QUOTENAME(@i)+'=rtrim(sum(case when con='[email protected]+' then 1 else 0 end))+N''次''',@[email protected]+1
    exec(@s+' from #t')
    /*
    0 1 2 3 4
    0次 0次 1次 1次 1次
    */
    go

    --问题2
    if OBJECT_ID('Tempdb..#t2') is not null
    drop table #t2
    select a.ID,sum(b.[数据]) as Total
    into #t2
    from (select a.id,isnull(max(b.ID),0) as ID2 from #1 as a left join #1 as b on b.id<a.ID and b.[数据]=0 where a.数据=0 group by a.ID)a
    inner join #1 as b on b.ID>a.ID2 and b.ID<a.ID
    group by a.ID
    --动态行转列declare @s nvarchar(4000),@i int,@j int
    select @i=MIN(Total),@j=MAX(Total) from #t2
    while @i<[email protected]
    select @s=isnull(@s+',','select ')+QUOTENAME(@i)+'=rtrim(sum(case when Total='+rtrim(@i)+' then 1 else 0 end))+N''次''',@[email protected]+1exec(@s+'from #t2 ')
    /*
    -5 -4 -3 -2 -1 0 1 2 3 4
    1次 0次 0次 0次 0次 0次 0次 0次 0次 2次
    */