表结构是这样的:id      name        num     
1        aa          12
2        bb          10
3        cc          1
4        dd           5
现在需求是这样的,搜索出   前N个数据,条件是他们的num总和大于总数(sum(num))的75%     是不是用having?怎么实现呢?

解决方案 »

  1.   


    select * from user_num group by user having num*4>=sum(num)*3
      

  2.   

    写错了,再来个.select * from user_num group by name having num*4>=sum(num)*3
      

  3.   

    前N个数据select top N * from user_num group by name having num*4>=sum(num)*3
      

  4.   

    这位同志理解错了我的意思了。这个N是不定的,比如前两个查出来的num的和大于总数的75%,那就只查前两条数据出来,如果是前三个的num的和大于总数的75%,则自动查出的是前三条数据。
      

  5.   

    select top N * from tableName 
    group by name
    having
    sum(num)>(select sum(num) from tableName)*0.75 试试看行不?
      

  6.   

    lz说的前N个是按照什么排序,按照ID,还是num?
      

  7.   

    这个N是不定的,比如前两个查出来的num的和大于总数的75%,那就只查前两条数据出来,如果是前三个的num的和大于总数的75%,则自动查出的是前三条数据。根据NUM来排序,从大的开始
      

  8.   

    if(object_id('tb') is not null)
    drop table tbcreate table tb
    (
    id int,
    name varchar(10),
    num int
    )insert tb(id,name,num)
    select  
    1, 'aa' ,76
    union  all
    select 
    2 ,'bb', 24;with cte
    as
    (select *, (select sum(num) from tb b where id<=a.id ) nums from tb a)select * from tb where 
    id <=( 
        select min(id) from 
            (select *, (select sum(num) from tb b where id<=a.id ) nums 
                from tb a) a where  nums > 
                     (select sum(num)*0.75 from tb))
    (2 行受影响)
    id          name       num
    ----------- ---------- -----------
    1           aa         76(1 行受影响)
      

  9.   

    你是说你有1,2,3,M,N个记录,找出其中的M,
    让1,2,3M的NUM加起来大于总和的75%。是不是呢?如果是,用2分法找。
    不过需要很多次夺取数据库。
      

  10.   


    create table Test(
    [id] [varchar](10),
    [name] [varchar](10),
    [num] [int]
    )insert into Test values('1','aa',12) ;
    insert into Test values('2','bb',10) ;
    insert into Test values('3','cc',1) ;
    insert into Test values('4','dd',5) ;
    select * from
     (
     select * from Test 
      group by name,id,num
      having 
      SUM(num) > ((select SUM(num) from Test)*0.75)
    ) as Test1
      

  11.   

    ALTER PROCEDURE [dbo].[p75]
    (
    @Percent int = 75
    )

    AS
    declare @All int;
    declare @StepSum int;
    declare @ItemsCounted int;
    declare @Step int;set @Step = 5;
    set @ItemsCounted = 0;
    set @All = (select sum(num) from [table]);while 1=1
    begin
    set @ItemsCounted = @ItemsCounted+@Step;
    set @StepSum =( select sum(num) from (select top (@ItemsCounted) num from [table]) t);--sql2000要想别的办法
    if(CONVERT(float,@StepSum) * 100/CONVERT(float,@All) >=@Percent) 
    break;
    endwhile 1=1
    begin
    set @ItemsCounted = @ItemsCounted-1;
    set @StepSum =( select sum(num) from (select top (@ItemsCounted) num from [table]) t);--sql2000要想别的办法
    if(CONVERT(float,@StepSum) * 100/CONVERT(float,@All) < @Percent) 
    begin
    --测试部分
    declare @LastSum float;
    set @LastSum = @StepSum;
    set @StepSum =( select sum(num) from (select top (@ItemsCounted+1) num from [table]) t);
    select @ItemsCounted+1 as 'N', 
    @All as '总和',
    @StepSum as '前N项总和',
    CONVERT(float,@StepSum) * 100/CONVERT(float,@All) as '前N项百分比',
    @LastSum * 100/CONVERT(float,@All) as '前N-1项百分比';
    --测试部分 end
    return @ItemsCounted+1;
    end
    end RETURN -1;
      

  12.   

    1 a          1
    2 b          16
    3 c          5
    4 d          4
    5 e          5
    6 f          6
    7 g          7
    8 h          8
    9 i          9
    10 j          4结果:
    N 总和 前N项总和 前N项百分比 前N-1项百分比
    8 65 52 80 67.6923076923077
      

  13.   

    存储过程当然是可以了,人家要的是一条SQL语句,哈哈
      

  14.   

    declare cs cursor for select num from tb_11
    declare cs1 cursor for select * from tb_11
    declare @sumValue float
    declare @tmpSum float
    set @tmpSum=0
    set @sumValue=0
    select @sumValue=sum(num) from tb_11
    set @sumValue=@sumValue*0.75
    declare @tmp float
    set @tmp=0
    open cs
    open cs1
    fetch next from cs into @tmp
    while(@tmpSum<@sumValue and @@fetch_status=0)
    begin
    fetch next from cs1
    fetch next from cs into @tmp
    set @tmpSum=@tmpSum+@tmp
    end
    close cs
    deallocate cs
    close cs1
    deallocate cs1
    复制过去,将tb_11该成你的表名,试试看,嫌换行太多的话就缩到一行
      

  15.   

    open cs
    open cs1
    fetch next from cs into @tmp
    fetch next from cs1
    set @tmpSum=@tmpSum+@tmp
    while(@tmpSum<@sumValue and @@fetch_status=0)
    从open那行到while那行少写了两行
      

  16.   

    个人浅见:13楼的CTE效率是很高,可是:
    1.必须是id的升序排列
    2.select *, (select sum(num) from tb b where id<=a.id ) nums from tb a
    这样的语句,如果数据量大,似乎效率也不会太高