-1

我有两张桌子。一个名为 *tbl_workers*,另一个名为 *tbl_attendance*。在 *tbl_worker* 中,我记录了工人的工资。在 *tbl_attendance* 中,我记录了他在特定日期的加班情况。现在,我想要的是首先为工人生成每小时工资。将工资除以 31,然后将结果除以 9,因为 9 小时是办公室的正常工作日。通过这样做,我掌握了工人的每小时费率。现在,我想要将 *tbl_attendence* 的每一行(OT 是列的名称)乘以工人的每小时费率,并将其存储在另一个名为 *overtime_rate* 的列中。到目前为止我所做的是:

SqlConnection con = new SqlConnection(@"Data Source=TIMBERTRENDZ-PC\NEWSERVER;Initial Catalog=trendz;user id=sa;Password=Letmein3#;Trusted_connection=False");
        con.Open();
        SqlCommand cmd = new SqlCommand("Select worker_salary from tbl_workers where worker_id='"+textBox1.Text +"'",con);
        int salary = (int)cmd.ExecuteScalar();
        salary = salary/31;
        salary = salary / 9;
        label1.Text = Convert.ToString(salary);
        SqlCommand cmd1 = new SqlCommand("Select ot from tbl_attendence where worker_id='"+textBox1.Text + "'",con);
        int ot = (int)cmd1.ExecuteScalar();
        ot = ot / 60;
        salary = salary * ot;
        SqlCommand cmd2 = new SqlCommand("update tbl_attendence set overtime_rate='"+salary +"' where worker_id='"+textBox1+ "'",con);
        /**int i = cmd2.ExecuteNonQuery();
        label2.Text = Convert.ToString(i);
        **/

但这会在与工作人员 ID 匹配的所有列中存储相同的数量。

4

1 回答 1

1

好的,我需要一个解释,首先,当它可以作为数据库中的单个更新完成时,为什么你要使用 ADO.Net当员工工资发生变化时变得不同步,您需要确保加班值也得到更新。

Select ((worker_salary / 31) / 9) * (ot / 60) 
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id
where worker_id=

此查询将根据您上面的计算为您提供 OT 率。然后更新 tbl_attendance 表中的 overtime_rate 字段,您可以运行

update tbl_attendence set overtime_rate= 
Select ((worker_salary / 31) / 9) * (ot / 60) )  
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id

这将为您更新所有工人的加班费率。无需使用 C#、ADO,它只是让 SQL Server 完成它的工作。在运行它之前验证 SQL,因为我是徒手输入的,没有检查括号等。

希望这可以帮助。

杰森

编辑:

为了帮助您进一步了解此查询的工作原理,我确保在列名中包含表名。只要两个表中都不存在列,查询就可以正常工作。

update tbl_attendence set overtime_rate= 
Select ((w.worker_salary / 31) / 9) * (a.ot / 60) )  
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id
于 2012-06-25T11:57:41.197 回答