直接上例子,大概情况如下:  Name   Rank
  A      1
  B      2
  C      2
  D      2
  E      3
  ...
  Z      50数据如上表所示,如何求出按10%,20%,40%,20%,10%的区段来分组的查询结果,这样的sql如何写?

解决方案 »

  1.   

    结果大概是 Name   Rank   Percent
     A      1      10%
     B      2      10%
     C      2      10%
     D      2      10%
     E      3      20%
     F      4      20%
     ...
     Z      50     后10%
      

  2.   

    用TOP PERCENT写死应该是可以做到
      

  3.   

    后面的%是怎么算来的?
    rank/sum(Rank)还是什么?
      

  4.   

    用Top percent求第一组10%没问题,但第二组的20%怎么求?而且rank是有重复的,比如“2”可能有几个,这个该怎么处理?这两个问题比较麻烦
      

  5.   


    搞个体力活
    declare @tb table([Name] varchar(1),[Rank] int)
    insert @tb
    select 'A',1 union all
    select 'B',2 union all
    select 'C',2 union all
    select 'D',2 union all
    select 'E',3 union all
    select 'F',2 union all
    select 'G',3 union all
    select 'H',4 union all
    select 'I',5 union all
    select 'J',6
    print '10%'
    select TOP 10 PERCENT * From @tb ORDER BY [NAME]print '20%'
    SELECT *
    FROM @tb
    where [name] >= (select top 1 [name] from (select top 90 percent [name] from @tb order by [name] desc) p order by [name])
         and [name]< (select top 1 [name] from (select top 70 percent [name] from @tb order by [name] desc) p order by [name])print '40%'
    SELECT *
    FROM @tb
    where [name] >= (select top 1 [name] from (select top 70 percent [name] from @tb order by [name] desc) p order by [name])
         and [name]< (select top 1 [name] from (select top 30 percent [name] from @tb order by [name] desc) p order by [name])print '20%'
    SELECT *
    FROM @tb
    where [name] >= (select top 1 [name] from (select top 30 percent [name] from @tb order by [name] desc) p order by [name])
         and [name]< (select top 1 [name] from (select top 10 percent [name] from @tb order by [name] desc) p order by [name])
    print '10%'
    select TOP 10 PERCENT * From @tb ORDER BY [NAME] desc
    --测试结果:
    /*(所影响的行数为 10 行)10%
    Name Rank        
    ---- ----------- 
    A    1(所影响的行数为 1 行)20%
    Name Rank        
    ---- ----------- 
    B    2
    C    2(所影响的行数为 2 行)40%
    Name Rank        
    ---- ----------- 
    D    2
    E    3
    F    2
    G    3(所影响的行数为 4 行)20%
    Name Rank        
    ---- ----------- 
    H    4
    I    5(所影响的行数为 2 行)10%
    Name Rank        
    ---- ----------- 
    J    6(所影响的行数为 1 行)
    */
      

  6.   

    我是按照NAME的排序取的百分比, 你想怎么样取??
      

  7.   

    就是把rank一样的放一起,按rank排序