如何在VB.Net中通过SQL从Access匹配CPI对应薪资区间到DataGridView
问题解答
1. 无需修改表结构即可实现匹配
只要tblPayrollDecision表中存储了CPI区间与RangeSalary的对应关系(不管是拆分的数值字段还是文本格式的区间),都可以通过SQL查询直接关联匹配,不需要修改表结构。
场景1:表中已有拆分的区间字段(如MinCPI、MaxCPI)
如果tblPayrollDecision已经有明确的最小CPI和最大CPI数值字段,直接用BETWEEN关联即可,示例SQL(兼容Access):
SELECT emp.EmployeeID, emp.EmployeeName, emp.TOTAL_CPI, pd.RangeSalary FROM ( -- 替换成你原本计算TOTAL CPI的查询逻辑 SELECT EmployeeID, EmployeeName, SUM(CPI_Score) AS TOTAL_CPI FROM tblEmployeeCPI GROUP BY EmployeeID, EmployeeName ) AS emp LEFT JOIN tblPayrollDecision pd ON emp.TOTAL_CPI BETWEEN pd.MinCPI AND pd.MaxCPI
场景2:区间存储为文本格式(如单独字段存类似"1.0-2.5"的文本)
如果区间是文本格式,可以用Access的字符串函数拆分出上下限数值,再做匹配:
SELECT emp.EmployeeID, emp.EmployeeName, emp.TOTAL_CPI, pd.RangeSalary FROM ( SELECT EmployeeID, EmployeeName, SUM(CPI_Score) AS TOTAL_CPI FROM tblEmployeeCPI GROUP BY EmployeeID, EmployeeName ) AS emp LEFT JOIN tblPayrollDecision pd ON emp.TOTAL_CPI >= Val(Split(pd.CPIRange, "-")(0)) AND emp.TOTAL_CPI <= Val(Split(pd.CPIRange, "-")(1))
2. 其他解决方案
方案一:内存中代码层面匹配
如果数据量不大,可以先把员工CPI数据和薪资区间数据都加载到内存(如DataTable),再通过VB.Net代码遍历匹配:
' 假设已获取员工CPI汇总表到dtEmpCPI ' 加载tblPayrollDecision数据到dtPayroll For Each empRow As DataRow In dtEmpCPI.Rows Dim totalCPI As Double = CDbl(empRow("TOTAL_CPI")) ' 查找匹配的薪资区间 Dim matchRow As DataRow = dtPayroll.AsEnumerable().FirstOrDefault( Function(pdRow) Return totalCPI >= CDbl(pdRow("MinCPI")) AndAlso totalCPI <= CDbl(pdRow("MaxCPI")) End Function ) ' 赋值RangeSalary empRow("RangeSalary") = If(matchRow IsNot Nothing, matchRow("RangeSalary"), "无对应薪资区间") Next ' 绑定到DataGridView dgvEmployeeData.DataSource = dtEmpCPI
方案二:优化表结构(备选)
如果后续这类查询频率高、数据量大,建议把文本格式的CPI区间拆分为MinCPI和MaxCPI两个数值字段——虽然需要修改表结构,但能大幅提升查询效率,避免字符串拆分的性能开销,同时让SQL逻辑更简洁。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

