【问题标题】:Summing up GROUP BY results总结 GROUP BY 结果
【发布时间】:2019-03-26 21:40:03
【问题描述】:

我正在使用这个 Oracle 数据库学习 SQL。

我在任务中遇到了一些问题:显示2004年、2005年、2006年年复一年的所有员工人数和录用人数。

这两部分我可以分开做,但是老师说要在一个查询中处理,不需要子查询。

SELECT COUNT(EMPLOYEE_ID) FROM EMPLOYEES;

以上行计算所有员工。

SELECT EXTRACT(YEAR FROM HIRE_DATE) AS YEAR, COUNT(EMPLOYEE_ID) AS HIRED_EMPLOYEES 
FROM EMPLOYEES 
WHERE EXTRACT(YEAR FROM HIRE_DATE) IN (2004, 2005, 2006) 
GROUP BY EXTRACT(YEAR FROM HIRE_DATE);

以上部分适用于计算 2004 年、2005 年、2006 年雇用的人数。

我认为也许有一种方法可以将我的结果按年份分组,并在这个单一查询中获得员工总数,但 WHERE 部分是障碍。我会很感激任何建议,可能尽可能简单,因为这只是我的第二类写作查询。

【问题讨论】:

  • UNION 两个查询?诡计多端...

标签: sql oracle group-by


【解决方案1】:

这会为您提供年度总数 - 请注意,这是曾经的员工总数 - 如果您只想计算 3 年的时间,请重新添加您的 WHERE 子句。

SELECT COUNT(EMPLOYEE_ID) AS HIRED_EMPLOYEES ,
SUM(CASE WHEN EXTRACT(YEAR FROM HIRE_DATE) AS YEAR = 2016 THEN 1 ELSE 0 END) as [2016 Hire Count],
SUM(CASE WHEN EXTRACT(YEAR FROM HIRE_DATE) AS YEAR = 2017 THEN 1 ELSE 0 END) as [2017 Hire Count],
SUM(CASE WHEN EXTRACT(YEAR FROM HIRE_DATE) AS YEAR = 2018 THEN 1 ELSE 0 END ) as [2018 Hire Count]
FROM EMPLOYEES ;

【讨论】:

  • 正是我的想法。 +1
  • 只是一个注释。不需要ELSE,因为在SQL 中默认值为NULL,而SUM() 会忽略它。
  • 所以这实际上分别计算了年份值为2016、2017、2018的行数,您能解释一下“1 else 0”部分的作用吗?
  • 嗨 Theta - 这是一种计算符合条件的行的快速方法。 EG - 如果您想象每一行都会有一个雇用日期,并且如果那是正确的年份,则设置为 1,否则设置为 0-而不是将所有这些 1 和 0 加在一起。
  • @johnMcTighe 一个非常好的解释和一个我一定会使用的技巧,非常感谢!
【解决方案2】:

我会这样做:

with
x as (
  select extract(year from hire_date) as year from employees
)
select
  count(*) as total,
  sum(case when year = 2004 then 1 end) as hired_2004,
  sum(case when year = 2005 then 1 end) as hired_2005,
  sum(case when year = 2006 then 1 end) as hired_2006
from x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多