2016-02-08 4 views
0

Я следующую таблицу:Несколько условий в SQL

Сотрудник ID Работник Статус Дата прекращения 1 А NULL 2 Нулевое 3 I 1/1/2016 4 I 12/15/2016 5 Я 1/1/2016

enter image description here

Я хотел бы сообщить о следующем:

  • Количество текущих активных сотрудников - 2
  • Количество неактивных сотрудников - 3
  • Количество сотрудников прерванных в прошлом один месяц - 2

Это кусок кода, я использовал:

select 
case when employee_status='A' then count(employee_id) else '' end, 
case when employee_status='I' then count(employee_id) else '' end, 
case when employee_status='I' 
then 
(select count(employee_id) 
    from employee 
where date_of_termination between '1/1/2016' and '2/1/2016') 
else '' end 
from employee 

Мой набор результатов:

Active | Inactive | Inactive_last_month 
    2 |  0 |     0 
    0 |  3 |     2 

Я хотел бы добиться следующего:

Active | Inactive | Inactive_last_month 
    2 |  3 |     2 

Любые рекомендации будут оценены.

ответ

0

Это должно быть возможным упростить ее с помощью SUM:

select 
sum(case when employee_status='A' then 1 else 0 end) as active, 
sum(case when employee_status='I' then 1 else 0 end) as inactive, 
sum(case when employee_status='I' and date_of_termination between '1/1/2016' and '2/1/2016' then 1 else 0 end) as inactive_last_month 
from employee 
+0

Это сработало. Благодарю. – Anonymous

0

Я woudl завернуть случае satements в сумме() функция, а также изменять ELSE часть заявления СЛУЧАЯ быть 0.

так что это будет выглядеть как-то вроде этого:

select 
SUM(case when employee_status='A' then count(employee_id) else 0 end) AS Active, 
SUM(case when employee_status='I' then count(employee_id) else 0 end) AS Inactive, 
SUM(case when employee_status='I' 
then 
(select count(employee_id) 
    from employee 
where date_of_termination between '1/1/2016' and '2/1/2016') 
else 0 end) AS Inactive_last_month 
from employee 
+0

Спасибо. В вашем запросе была добавлена ​​дополнительная «сумма», которую я редактировал, и она отлично прекратилась. Благодарю. – Anonymous

+0

@ Анонимный рад помочь! Я удалил дополнительный SUM() –

0

Вы должны SUM до количества строк, которые соответствуют критериям: каждый

SELECT 
    SUM(CASE WHEN date_of_termination IS NULL THEN 1 ELSE 0 END) AS active, 
    SUM(CASE WHEN date_of_termination IS NOT NULL THEN 1 ELSE 0 END) AS inactive, 
    SUM(CASE WHEN date_of_termination BETWEEN '20160101' AND '20160201' THEN 1 ELSE 0 END) AS inactive_last_month 
FROM 
    Employee 

Я игнорировал employee_status столбец с предположением о том, что дата является достаточным для определения того, является ли активным/неактивным работник - в этом случае этот столбец, вероятно, даже не должно существовать в таблице, так как это дублирование данных.

+1

Некоторые сотрудники - реиры, у которых разные статусы, поэтому необходим столбец. Но агрегация была полезна. Благодарю. – Anonymous

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