编写一个SQL查询,确定每个职位可以雇用多少员工
我有一个表,有id列、职位列、薪水列的候选人。候选人的ID不断增加,并按工资升序排列编写一个SQL查询,确定每个职位可以雇用多少员工,sql,Sql,我有一个表,有id列、职位列、薪水列的候选人。候选人的ID不断增加,并按工资升序排列 id position salary -- -------- ------ 20 junior 10000 30 senior 15000 40 senior 30000 50 senior 35000 我有50000美元可以雇一些员工。有了这笔钱,我需要雇佣最多的高级职位,剩下的钱我将雇佣最多的初级职位。输出应返回一个包含两列的employees表:junior和seniors 输出: ju
id position salary
-- -------- ------
20 junior 10000
30 senior 15000
40 senior 30000
50 senior 35000
我有50000美元可以雇一些员工。有了这笔钱,我需要雇佣最多的高级职位,剩下的钱我将雇佣最多的初级职位。输出应返回一个包含两列的employees表:junior和seniors
输出:
juniors seniors
------- -------
0 2
我认为使用CTE很容易理解 这里是一个例子,我将尝试解释我的想法如下
Create Table #temp
(
id int
,position varchar(10)
,salary int
)
INSERT INTO #temp
VALUES
(20,'junior',10000),
(30,'senior',15000),
(40,'senior',30000),
(50,'senior',35000)
DECLARE @budget int = 50000
;With detail as (
SELECT *,
@budget-s.Sum_Salary as RemainingBudget
FROM
(
SELECT *,
RANK() over (partition by position order by salary asc) as salaryRank,
LAG(salary,1,0) over (partition by position order by salary asc) + salary AS Sum_Salary
FROM #temp
) AS s
)
,
Result as (
SELECT CASE WHEN detail.RemainingBudget >= junior.Sum_Salary
THEN
junior.salaryRank
ELSE
0
END AS juniors
,detail.salaryRank AS seniors
FROM detail
OUTER APPLY (SELECT * FROM detail WHERE position= 'junior') AS junior
WHERE detail.Sum_Salary = (SELECT MAX(Sum_Salary) FROM detail WHERE position ='senior' AND Sum_Salary<=@budget)
)
SELECT TOP 1 * FROM Result
ORDER BY juniors desc
DROP TABLE #temp
其次,你可以找出“高级”员工的最大数量
SELECT MAX(Sum_Salary) FROM detail WHERE position ='senior' AND Sum_Salary<=@budget
SELECT MAX(Sum_Salary) FROM detail WHERE position ='senior' AND Sum_Salary<=@budget
CASE WHEN detail.RemainingBudget >= junior.Sum_Salary
THEN
junior.salaryRank
ELSE
0
END AS juniors