2013-04-01 3 views
2

Я просматриваю практический лист с вопросами и ожидаемыми результатами. Последний вопрос мне трудно понять. Может кто-нибудь помочь, пожалуйста.Начальная функция SQL SQL Count Множественные столбцы

Вопрос

Создание запроса для отображения общего количества сотрудников, и из этой суммы, количество сотрудников, нанятых в 2005, 2006, 2007 и 2008

Ожидаемый формат вывода

Total 2005 2006 2007 2008 
107 29 24 19 11 

Ниже приведены мои попытки получить результаты с отдельными запросами

TO_CHAR(hire_date,'YYYY') 
SELECT COUNT(employee_id) AS "Total" 
FROM employees; 

SELECT COUNT(employee_id) AS "2005" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2005' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

SELECT COUNT(employee_id) AS "2006" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2006' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

SELECT COUNT(employee_id) AS "2007" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2007' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

SELECT COUNT(employee_id) AS "2008" 
FROM employees 
WHERE TO_CHAR(hire_date,'YYYY') LIKE '2008' GROUP BY TO_CHAR(hire_date,'YYYY') ; 

Любая помощь, дающая результат как один запрос, очень ценится.

+0

Что-то, как это должно работать: 'SELECT COUNT (*) AS numEmpls, TO_CHAR (hire_date, 'YYYY') AS theYear от сотрудников GROUP BY TO_CHAR (hire_date, 'YYYY')' –

ответ

1

Вы пытаетесь поворота в данных, так что вы можете использовать свой существующий запрос, но добавить выражение CASE внутри агрегата:

SELECT COUNT(employee_id) AS "Total", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2005' then 1 else 0 end) "2005", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2006' then 1 else 0 end) "2006", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2007' then 1 else 0 end) "2007", 
    sum(case when TO_CHAR(hire_date,'YYYY') = '2008' then 1 else 0 end) "2008" 
FROM employees; 

в зависимости от версии Oracle, вы можете быть в состоянии использовать PIVOT функцию:

select * 
from 
(
    select count(*) over() Total, 
    TO_CHAR(hire_date,'YYYY') Year 
    from employees 
) 
pivot 
(
    count(Year) 
    for Year in ('2005', '2006', '2007', '2008') 
) 

См Demo of both queries

+0

Большое спасибо, это то, что я искал. – knatz

+0

@knatz Приветствую вас, я добавил версию с помощью 'PIVOT', если вы используете Oracle 11g + – Taryn

2

Чтобы поместить их в столбцах используйте условное aggreagtaion:

select count(*) as Total, 
     sum(case when to_char(hire_date, 'yyyy') = '2005' then 1 else 0 end) as "2005", 
     sum(case when to_char(hire_date, 'yyyy') = '2006' then 1 else 0 end) as "2006", 
     sum(case when to_char(hire_date, 'yyyy') = '2007' then 1 else 0 end) as "2007", 
     sum(case when to_char(hire_date, 'yyyy') = '2008' then 1 else 0 end) as "2008" 
from employees 
where to_char(hire_date, 'yyyy') in ('2005', 2006', '2007', '2008') 
+0

Спасибо вы за помощь есть какое-то преимущество для добавления предложения where – knatz

+1

. Ваша сумма будет неправильной без этого. – Horus

+0

Чтобы добавить к тому, что говорит Хорус, если в таблице указаны данные предыдущего 2005 года или после 2008 года, счет будет отключен в первом столбце «Всего». – Jordan

Смежные вопросы