我正在尝试编写一个sql查询,以确定去年每个部门因新员工的工资增加了多少。
表结构是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;
但无论如何我试图减去这两个查询的结果我只会得到错误。
答案 0 :(得分:2)
这是你可能会做的。在这种情况下,我使用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
)代替这些。
答案 1 :(得分:1)
为什么不改变where
的方向?
SELECT sum(msal)
FROM employees
WHERE hiredate <= DATEADD(year, -1, GETDATE())
GROUP BY deptno;
此外,通常当您按字段聚合时,字段(deptno
)将包含在select
子句中。