总结GROUP BY结果

时间:2019-03-26 13:30:33

标签: sql oracle group-by

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

diagram

我在执行任务时遇到了一些问题:逐年显示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部分是一个障碍。我将不胜感激任何建议,可能尽可能地简单,因为这只是我编写查询的第二类。

2 个答案:

答案 0 :(得分:2)

这将为您提供年度总数-请注意,这是有史以来的雇员总数-如果您只想计算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 :(得分:1)

我会做类似的事情:

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