可能標題描述得不清楚。那么看這里詳細描述。謝謝。
假如,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表 匹配計算績效系數???
再次感謝。
uj5u.com熱心網友回復:
或者,在 Delphi 里如何解決,老師也可以給一個思路啊。uj5u.com熱心網友回復:
上一個帖子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) 不一樣。沒有辦法分得清楚。。。
uj5u.com熱心網友回復:
....你們單位招人不。。。。測驗了下。演算法如下: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
uj5u.com熱心網友回復:
不好意思。最后哪個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
uj5u.com熱心網友回復:
delphi + SQL資料集,即可。uj5u.com熱心網友回復:
非常感謝。。。但是,這里面的 “10” ,我們沒有這樣的常數呢。總分 150 , 140 , 130 其實是不固定的呢。
uj5u.com熱心網友回復:
資料集是 A CROSS JOIN B 么?
然后 delphi 怎么處理?
uj5u.com熱心網友回復:
根據經驗而言,這個問題并不是樓主描述的如此簡單隨著資料量的不斷增大,演算法會變得效率低下至無效率——因為直接的演算法,都是直接對同一個或幾個物理表進行大量的計算后才最終得到查詢結果集,隨著資料量的日益增大,很多資源的需求就會嚴重拖累服務器性能
簡單而言,樓主需要的就是將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就可以了。
也是因為多了這三個視圖,也就讓演算法直觀易懂了。
實際的實踐中,當資料改動的時候,服務器會動態對視圖更新,效率比實際演算法高多了
而且對資料量的日益增大,對于執行效率影響并不明顯
我也許可以預測到本題只是樓主系統中的冰山一角,所以,我從著到尾只跟樓主說了方法,并沒有說演算法,希望能對你有用
uj5u.com熱心網友回復:
拼了老命,等我回。我點思路!uj5u.com熱心網友回復:
非常感謝前輩提點。
uj5u.com熱心網友回復:
好的。等你。
uj5u.com熱心網友回復:
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47703.html
標籤:數據庫相關
上一篇:inno setup匯入元件出錯
