我正在使用此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部分是一个障碍。我将不胜感激任何建议,可能尽可能地简单,因为这只是我编写查询的第二类。
答案 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