Подведение итогов GROUP BY - PullRequest
       28

Подведение итогов GROUP BY

0 голосов
/ 26 марта 2019

Я изучаю SQL, используя эту базу данных Oracle.

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 ]

2 голосов
/ 26 марта 2019

Это дает вам общее годовое значение. Обратите внимание, что это общее количество сотрудников за все время. Если вы хотите рассчитывать только на 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 голос
/ 26 марта 2019

Я бы сделал что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...