Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写一个SQL查询,确定每个职位可以雇用多少员工_Sql - Fatal编程技术网

编写一个SQL查询,确定每个职位可以雇用多少员工

编写一个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列、职位列、薪水列的候选人。候选人的ID不断增加,并按工资升序排列

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