-3

「Employees」テーブルと「Department」テーブルの 2 つのテーブルを作成しました。

部門テーブルの列名は次のとおりです。

Dept_ID, Dept_Name 

ここで、主キーを割り当てましたDept_ID

Employees テーブルの列名は次のとおりです。

Emp_ID, FName, LName, City, Emp_Salary, Dept_ID

ここでは、参照 用に主キーEmp_IDと外部キーを割り当てましたDept_IDDepartment(Dept_ID)

2番目に給与が高い部署名が知りたいです。構文が必要です

助けてください

4

2 に答える 2

1

Oracle の場合、これは次のクエリになります。

SELECT d.Dept_Name
FROM (
  SELECT rownum AS position, a.*
  FROM (
    SELECT Dept_ID, SUM(Emp_Salary) as Total_Salary
    FROM employees
    GROUP BY Dept_ID
    ORDER BY Total_Salary DESC
  ) a
) b
INNER JOIN department d ON d.Dept_ID = b.Dept_ID
WHERE b.position = 2

ここで動作する Oracle SQLFiddle の例を見ることができます: http://sqlfiddle.com/#!4/f5602/17

完全を期すために、DBMS が MySQL の場合、次のクエリでうまくいきます。

SELECT d.Dept_Name
FROM (
  SELECT Dept_ID, SUM(Emp_Salary) as Total_Salary
  FROM employees
  GROUP BY Dept_ID
  ORDER BY Total_Salary DESC
  LIMIT 1,1
) a
INNER JOIN department d ON d.Dept_ID = a.Dept_ID

ここで MySQL SQLFiddle の動作例を確認できます: http://sqlfiddle.com/#!2/738e0/15

于 2013-06-13T10:25:44.720 に答える
0

これが MSSQL の場合は、次のクエリを試してください。

with salary as --sum all salaries for all departments
(
    select d.Dept_ID, SUM(e.Emp_Salary) as SalarySum
    from Department d
    inner join Employees e on e.Dept_ID = d.Dept_ID
    group by d.Dept_ID
),
max as --select maximum salary
(
    select  MAX(s.SalarySum) as Max
    from salary s
)

select top 1 * 
from salary s
where s.SalarySum < (select top 1 m.Max from max m) -- only select those that are lower than max
order by s.SalarySum desc
于 2013-06-13T10:10:00.980 に答える