【问题标题】:Subtracting multi-row queries减去多行查询
【发布时间】:2015-02-05 04:37:36
【问题描述】:

我正在尝试编写一个 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;

但无论我尝试如何减去这两个查询的结果,我都只会得到错误。

【问题讨论】:

  • 也许你应该显示错误?

标签: sql oracle oracle11g


【解决方案1】:

这是您可以做的。在这种情况下,我使用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)代替这些。

【讨论】:

  • 这是一个非常优雅的解决方案!谢谢你。我知道 Oracle 没有 DATEADD 或 GETDATE(),但我试图在 MySQL 中玩弄减法,我的思绪被困在了它上面。假设有人要规范化工资并将其分解到不同的表中,查询会是什么样子?
  • 你的意思是,工资在与员工分开的表中?根据您的想法编辑您的问题,我将尝试编辑我的答案。
【解决方案2】:

为什么不直接改变where的方向?

SELECT sum(msal)
FROM employees
WHERE hiredate <= DATEADD(year, -1, GETDATE())
GROUP BY deptno;

此外,通常当您按字段聚合时,该字段 (deptno) 会包含在 select 子句中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2013-09-17
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多