根据职位设置员工佣金

时间:2019-01-21 19:06:25

标签: sql oracle

我刚刚开始学习一些SQL,并且我正在使用Oracle数据库11g。我的问题是我有一个职员表,我试图根据职员的职位更新每个职员的佣金。我想将正式员工的佣金更新为0.04(4%),将经理的佣金更新为0.05(5%)。

有一种方法可以在一个语句中完成所有这些操作吗?

我这样做的方式是,我只是通过以下方式更新了所有员工佣金:

UPDATE staff SET commission = 0.04;

然后我做了另一个更新语句来仅更新管理器

UPDATE staff SET commission = 0.05 WHERE position = 'Manager';

我在想一些与此类似的东西,但是这不会起作用。

UPDATE staff SET commission = 0.04 WHERE NOT position = 'Manager' AND SET commission = 0.05
WHERE position = 'Manager';

感谢您的帮助!非常感谢!

3 个答案:

答案 0 :(得分:2)

您可以在此处使用CASE表达式:

UPDATE staff
SET commission = CASE WHEN position = 'Manager'
                      THEN 0.05
                      ELSE 0.04 END;

这假设您确实想对每位非经理人进行总括分配,佣金为0.04。

答案 1 :(得分:1)

更灵活的方法是拥有一个包含位置相关数据的位置表。

CREATE TABLE position
(
    PositionID NUMBER(10) NOT NULL,
    Position NVARCHAR2(50) NOT NULL,
    Commission NUMBER(8, 4) NOT NULL
);

然后,每位工作人员都会通过一列引用职位

PositionID NUMBER(10) NOT NULL

那么您只需要更新头寸表中的佣金

UPDATE position SET Commission = 0.05 WHERE Position = 'Manager';

这使您可以轻松区分两个以上的位置。

另请参阅:Oracle / PLSQL: Foreign Keys

答案 2 :(得分:1)

在Oracle中,解码是一种便捷的方法:

method q(i: seq<int>) returns (o: seq<int>)
  ensures o == s(i)
{  
  var n := 0;
  o := [];

  while n < |i|
    invariant n <= |i| && o + s(i[n..]) == s(i)
  {
    if i[n] == 42 {
      o := o + [i[n]];
    } 
    n := n + 1;
  } 
}