计算存在的工资

时间:2015-01-30 04:02:00

标签: sql

我有桌子员工和桌子家庭。让我们说员工有名称栏和工资栏。 然后我必须计算他们的工资:3%是有家庭的员工的工资,2%是所有没有家庭的人。 你知道怎么做吗?我知道我必须使用存在,但我不知道如何计算工资。

此表员工:

employeeID int, 
Name varchar(10), 
PhoneNumber varchar(20), 
ICNumber varchar(15), 
Salary decimal(5,2), 
primary key(employeeId)); 

这是表格族

familyId int, 
name varchar(20), 
family varchar(20), 
address varchar(25), 
phoneNumber varchar(20), 
employeeID int, 
primary key (employeeID), 
FOREIGN KEY (employeeID) REFERENCES Employee(employeeID))

3 个答案:

答案 0 :(得分:0)

  

如果子查询返回至少一行,则SQL EXISTS条件与子查询结合使用并被视为满足。它可以在SELECT,INSERT,UPDATE或DELETE语句中使用。

http://www.techonthenet.com/sql/exists.php

因此,让我们看看我们如何使用它来确定是否将特定薪水更新3%或2%。

对于有家庭的员工:

UPDATE Employee 
SET Salary = 1.03 * Salary 
WHERE EXISTS (
    SELECT 1 FROM Family WHERE Employee.employeeId = Family.employeeId
)

我将另一个案例作为练习留给读者(hint)。

<强>更新

如果您只想选择新薪水

SELECT employeeId, 1.03 * Salary As NewSalary FROM Employee
WHERE EXISTS (
    SELECT 1 FROM Family WHERE Employee.employeeId = Family.employeeId
)

答案 1 :(得分:0)

我假设你想选择+ 3%或+ 2%的价值而不是更新?

SELECT
  employeeid,
  salary,
  salary * loading_factor AS loading
FROM (
  SELECT
    employeeid,
    salary,
    CASE
      WHEN EXISTS SELECT 1 FROM family f WHERE f.employeeID = e.employeeID THEN 0.03
      ELSE 0.02
    END AS loading_factor
  FROM employee e
)

你可以在没有子选择的情况下做到这一点,但我认为它会更容易阅读。如果您想要新的工资总额而不是增量,请将0.02 / 0.03更改为1.02 / 1.03。

答案 2 :(得分:0)

就个人而言,我尝试尽可能不使用existsnot exists条款。在您的情况下,您可以使用左外连接获得所需的结果:

select
  emp.name,
  emp.salary,
  case when fam.employeeID is null 
       then 0.02
       else 0.03 
  end  * emp.salary  salary_adjusted
from
  employee   emp    left join
  family     fam on emp.employeeID = fam.employeeID;