胜负比率计算问题?如何用SQL语句实现?(存储过程也可以) 表一
姓名编号 合计积分
1009 9
1001 8
1002 8
1003 6
1004 6
1005 6
… 5
… 4
… 4
积分一样的可能有多个人,不同积分一样的可能有多个组. 比赛规则是,积分同的,就找到积分相同的人计算他们之间的比率.
如上表,1001与1002积分相同,那就在下表中找出1001与1002的所有记录.
并求出1001与1002的各自胜局总和进行相比.
表二 姓名编号1 胜局数 姓名编号2 胜局数
1003 2 1001 1 1001与1003就是2:1
1001 1 1005 2
1002 3 1005 2
1005 1 1004 2
1004 2 1005 3
1001 0 1002 2
1003 1 1004 2
1002 3 1001 2
1003 2 1005 1
… … … …姓名编号 合计积分 胜负比率
1009 9
1001 8 2/5=0.4
1002 8 5/2=2.5
1003 6
1004 6 ?
1005 6 ?
所以排名1002应在1001前面
最后结果显示的表如下:
姓名编号 合计积分 胜负比率
1009 9
1002 8 2.5
1001 8 0.4
1003 6 ?
1004 6 ?
1005 6 ?
合计积分相同的,按胜负比率排序.
[email protected]

解决方案 »

  1.   

    select 姓名编号, 合计积分,胜局/负局 as 胜负比率 
    from table1 a inner join 
         (Select 姓名编号1,sum(Flag) as 胜局 from 
                               (Select姓名编号1,胜局数1,(case when 胜局数1>胜局数2 then 1 
                                     else 0  end)  as Flag  from table2 ) T 
          group by 姓名编号1) b
         on a.姓名编号=b.姓名编号1 
             inner join 
         (Select 姓名编号2,sum(Flag) as 负局 from 
                               (Select姓名编号1,胜局数1,(case when 胜局数1>胜局数2 then 1 
                                     else 0  end)  as Flag  from table2 ) T 
          group by 姓名编号2 ) c
    a.姓名编号=c.姓名编号2
    order by 合计积分 desc ,胜局/负局                                         
        
       
      

  2.   

    create table 表一
    (姓名编号 int,合计积分 int)
    create table 表二
    (姓名编号1 int,胜局数1 int,
    姓名编号2 int,胜局数2 int)
    insert into 表一 select 1009,9
    insert into 表一 select 1001,8
    insert into 表一 select 1002,8
    insert into 表一 select 1003,6
    insert into 表一 select 1004,6
    insert into 表一 select 1005,6insert into 表二 select 1003,2,1001,1
    insert into 表二 select 1001,1,1005,2
    insert into 表二 select 1002,3,1005,2
    insert into 表二 select 1005,1,1004,2
    insert into 表二 select 1004,2,1005,3
    insert into 表二 select 1001,0,1002,2
    insert into 表二 select 1003,1,1004,2
    insert into 表二 select 1002,3,1001,2
    insert into 表二 select 1003,2,1005,1select a.姓名编号,a.合计积分,b.WF_Rate as 胜负比率
    from 表一 as a left join
    (select 姓名编号1,sum(winCount)*1.0/sum(failCount) as WF_Rate
    from 
    (select 姓名编号1,sum(胜局数1) as winCount,sum(胜局数2) as failCount
    from 表二
    group by 姓名编号1
    union all
    select 姓名编号2,sum(胜局数2),sum(胜局数1)
    from 表二
    group by 姓名编号2) as temp_table
    group by 姓名编号1) as b
    on a.姓名编号=b.姓名编号1
    order by 合计积分 desc,胜负比率 desc