可能标题描述得不清楚。那么看这里详细描述。谢谢。
假如,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表 匹配计算绩效系数???再次感谢。
假如,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表 匹配计算绩效系数???再次感谢。
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) 不一样。没有办法分得清楚
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
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
数据集是 A CROSS JOIN B 么?然后 delphi 怎么处理?
所以:
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就可以了。
也是因为多了这三个视图,也就让算法直观易懂了。
实际的实践中,当数据改动的时候,服务器会动态对视图更新,效率比实际算法高多了
而且对数据量的日益增大,对于执行效率影响并不明显我也许可以预测到本题只是楼主系统中的冰山一角,所以,我从着到尾只跟楼主说了方法,并没有说算法,希望能对你有用
把 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;