减去多行查询
Subtracting multi-row queries
我正在尝试编写一个 sql 查询来计算去年每个部门的薪水因新员工增加了多少。
Table 结构是 Employees (empno, deptno, msal, hiredate)
我可以弄清楚如何按部门获得所有工资
SELECT sum(msal) FROM employees GROUP BY deptno;
以及如何从过去一年雇用的人那里得到薪水
SELECT sum(msal) FROM employees WHERE hiredate > (DATEADD(year, -1, GETDATE())) GROUP BY deptno;
但是无论我尝试用什么方法减去这两个查询的结果,我只会得到错误。
为什么不直接改变 where
的方向?
SELECT sum(msal)
FROM employees
WHERE hiredate <= DATEADD(year, -1, GETDATE())
GROUP BY deptno;
此外,通常当您按字段聚合时,字段 (deptno
) 包含在 select
子句中。
这是您可能会做的事情。在这种情况下,我使用 CASE
语句来过滤新员工:
SELECT SUM(msal) - SUM(CASE WHEN hiredate > ADD_MONTHS(SYSDATE, -12) THEN msal ELSE 0 END)
FROM employees
GROUP BY deptno;
仅供参考,Oracle 没有 DATEADD()
函数,也没有 GETDATE()
函数。请注意,我使用 ADD_MONTHS()
和 SYSDATE
(您也可以使用 CURRENT_DATE
)代替这些。
我正在尝试编写一个 sql 查询来计算去年每个部门的薪水因新员工增加了多少。
Table 结构是 Employees (empno, deptno, msal, hiredate)
我可以弄清楚如何按部门获得所有工资
SELECT sum(msal) FROM employees GROUP BY deptno;
以及如何从过去一年雇用的人那里得到薪水
SELECT sum(msal) FROM employees WHERE hiredate > (DATEADD(year, -1, GETDATE())) GROUP BY deptno;
但是无论我尝试用什么方法减去这两个查询的结果,我只会得到错误。
为什么不直接改变 where
的方向?
SELECT sum(msal)
FROM employees
WHERE hiredate <= DATEADD(year, -1, GETDATE())
GROUP BY deptno;
此外,通常当您按字段聚合时,字段 (deptno
) 包含在 select
子句中。
这是您可能会做的事情。在这种情况下,我使用 CASE
语句来过滤新员工:
SELECT SUM(msal) - SUM(CASE WHEN hiredate > ADD_MONTHS(SYSDATE, -12) THEN msal ELSE 0 END)
FROM employees
GROUP BY deptno;
仅供参考,Oracle 没有 DATEADD()
函数,也没有 GETDATE()
函数。请注意,我使用 ADD_MONTHS()
和 SYSDATE
(您也可以使用 CURRENT_DATE
)代替这些。