计算A表某列合计值,由合计值从B表寻找匹配记录再进行计算

WindowsX 2017-09-06 05:03:03
可能标题描述得不清楚。那么看这里详细描述。谢谢。
假如,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表 匹配计算绩效系数???

再次感谢。
...全文
568 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
whb00120012 2017-10-25
  • 打赏
  • 举报
回复
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;
WindowsX 2017-09-28
  • 打赏
  • 举报
回复
引用 9 楼 shadowpj 的回复:
拼了老命,等我回。我点思路!
好的。等你。
WindowsX 2017-09-28
  • 打赏
  • 举报
回复
引用 8 楼 doloopcn 的回复:
根据经验而言,这个问题并不是楼主描述的如此简单 随着数据量的不断增大,算法会变得效率低下至无效率——因为直接的算法,都是直接对同一个或几个物理表进行大量的计算后才最终得到查询结果集,随着数据量的日益增大,很多资源的需求就会严重拖累服务器性能 简单而言,楼主需要的就是将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就可以了。 也是因为多了这三个视图,也就让算法直观易懂了。 实际的实践中,当数据改动的时候,服务器会动态对视图更新,效率比实际算法高多了 而且对数据量的日益增大,对于执行效率影响并不明显 我也许可以预测到本题只是楼主系统中的冰山一角,所以,我从着到尾只跟楼主说了方法,并没有说算法,希望能对你有用
非常感谢前辈提点。
shadowpj 2017-09-20
  • 打赏
  • 举报
回复
拼了老命,等我回。我点思路!
doloopcn 2017-09-11
  • 打赏
  • 举报
回复
根据经验而言,这个问题并不是楼主描述的如此简单 随着数据量的不断增大,算法会变得效率低下至无效率——因为直接的算法,都是直接对同一个或几个物理表进行大量的计算后才最终得到查询结果集,随着数据量的日益增大,很多资源的需求就会严重拖累服务器性能 简单而言,楼主需要的就是将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就可以了。 也是因为多了这三个视图,也就让算法直观易懂了。 实际的实践中,当数据改动的时候,服务器会动态对视图更新,效率比实际算法高多了 而且对数据量的日益增大,对于执行效率影响并不明显 我也许可以预测到本题只是楼主系统中的冰山一角,所以,我从着到尾只跟楼主说了方法,并没有说算法,希望能对你有用
WindowsX 2017-09-09
  • 打赏
  • 举报
回复
引用 5 楼 lyhoo163 的回复:
delphi + SQL数据集,即可。
数据集是 A CROSS JOIN B 么? 然后 delphi 怎么处理?
WindowsX 2017-09-09
  • 打赏
  • 举报
回复
引用 4 楼 shadowpj 的回复:
不好意思。最后哪个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
非常感谢。。。但是,这里面的 “10” ,我们没有这样的常数呢。总分 150 , 140 , 130 其实是不固定的呢。
WindowsX 2017-09-07
  • 打赏
  • 举报
回复
上一个帖子 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) 不一样。没有办法分得清楚。。。
WindowsX 2017-09-07
  • 打赏
  • 举报
回复
或者,在 Delphi 里如何解决,老师也可以给一个思路啊。
lyhoo163 2017-09-07
  • 打赏
  • 举报
回复
delphi + SQL数据集,即可。
shadowpj 2017-09-07
  • 打赏
  • 举报
回复
不好意思。最后哪个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
shadowpj 2017-09-07
  • 打赏
  • 举报
回复
....你们单位招人不。。。。测试了下。算法如下: 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

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧