可能标题描述得不清楚。那么看这里详细描述。谢谢。
假如,A表数据是这样:
姓名          部门           年度         月份            月薪                满分               得分
Sname     Dname      cbYear      cbMonth     MonthPay       Score           Score_1
甲             办公室        2017          7                 4500              50                 45
甲             办公室        2017          8                 4800              50                 49
甲             采购科        2017          9                 4800              50                 46
乙             采购科        2017          7                 4500              50                 44
乙             采购科        2017          8                 4500              50                 40
乙             采购科        2017          9                 4600              50                 49
丙             财务室        2017          9                 3900              50                 48
...
依此类推。B表数据是这样:
得分分数         计算绩效系数
Lscore              Plevel
 150                    1
 140                    0.9
 130                    0.7
...
依此类推。
-------------------------------------------------------------------------------------
绩效薪酬按月薪5%发放。
sum(Score_1)  或者 sum(MonthPay) 是 where (cbMonth=7 or cbMonth=8 or cbMonth=9)
问题是这样的:
如果 140<sum(Score_1)≤150 则计算季度绩效工资 Sum(MonthPay)*0.05*1
如果 130<sum(Score_1)≤140 则计算季度绩效工资 Sum(MonthPay)*0.05*0.9
如果 120<sum(Score_1)≤130 则计算季度绩效工资 Sum(MonthPay)*0.05*0.7
...
依此类推。如何根据A表 sum(Score_1) 的值 去B表 匹配计算绩效系数???再次感谢。

解决方案 »

  1.   

    或者,在 Delphi 里如何解决,老师也可以给一个思路啊。
      

  2.   

    上一个帖子
    http://bbs.csdn.net/topics/392251990
    提到如何根据 sum(Score_1) 找到对应的 计算绩效系数 Plevel 。
    SELECT Plevel FROM B
    WHERE ABS(Lscore-sum(Score_1))=(SELECT MIN(ABS(Lscore-sum(Score_1))) FROM B where Lscore < sum(Score_1))可是,每个姓名的合计得分 sum(Score_1) 不一样。没有办法分得清楚
      

  3.   

    ....你们单位招人不。测试了下。算法如下:
    select sname '姓名',
    sum(score_1) as '总分数',
    isnull((select plevel from B where lscore-sum(score_1)>=0 and lscore-sum(score_1)<10),0) as '系数',
    Sum(MonthPay)*0.05*isnull((select plevel from B where lscore-sum(score_1)>=0 and lscore-sum(score_1)<10),0) as '绩效薪酬'
    from A ls group by sname
      

  4.   

    不好意思。最后哪个IS 不要。是这样的select sname '姓名',
    sum(score_1) as '总分数',
    isnull((select plevel from a where lscore-sum(score_1)>=0 and lscore-sum(score_1)<10),0) as '系数',
    Sum(MonthPay)*0.05*isnull((select plevel from a where lscore-sum(score_1)>=0 and lscore-sum(score_1)<10),0) as '绩效薪酬'
    from b group by sname
      

  5.   

    delphi + SQL数据集,即可。
      

  6.   


    数据集是  A CROSS JOIN B 么?然后 delphi  怎么处理?
      

  7.   

    根据经验而言,这个问题并不是楼主描述的如此简单随着数据量的不断增大,算法会变得效率低下至无效率——因为直接的算法,都是直接对同一个或几个物理表进行大量的计算后才最终得到查询结果集,随着数据量的日益增大,很多资源的需求就会严重拖累服务器性能简单而言,楼主需要的就是将B.Plevel JOIN A
    所以:
    1.找到Join 规则的KEY,这个KEY就是LScore
    2.问题:A表中没有KEY--LScore
    2.1制造A表中的KEY--LScore——通过统计:Select Sname,Sum(Score_1) as KEY Group By Sname
    2.2将2.1中的统计制作为视图——定义为C,这是关键点
    2.3整合A 、C,将C Join到A中,形成D视图,这是关键点
    3.形成结果集:将B.LScore Join到D形成最终结果集视图E以上,使用到了CDE三个视图,最终我们在程序中只需要调用视图E就可以了。
    也是因为多了这三个视图,也就让算法直观易懂了。
    实际的实践中,当数据改动的时候,服务器会动态对视图更新,效率比实际算法高多了
    而且对数据量的日益增大,对于执行效率影响并不明显我也许可以预测到本题只是楼主系统中的冰山一角,所以,我从着到尾只跟楼主说了方法,并没有说算法,希望能对你有用
      

  8.   

    create  view  v1  as select    姓名,sum(薪金)  s1 , sum(得分)  s2 from  table1 group by  姓名  where   月份 IN(7,8,9);
    把 B 表改为:
    Lscore_begin   lscore _end             Plevel
     150                      140                               1
     140                      130                             0.9
     130                      120                             0.7
    ... 
     
    select    a.姓名,a.s1*b.plevel   from  a v1 ,b b    where   a.s2 >b.lscore_end and a.s2<=lscore_b.begin;