Подсчитать количество обращений

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть таблица, Leaves которая имеет Employee ID , Leave Type и Date . Например, если сотрудник с ID = 1234 подает заявление на отпуск по болезни с 1 июня 2014 года по 5 июня 2014 года, это будет храниться в таблицах отпусков изо дня в день, что означает, что будут добавлены следующие записи: 1234 отпуска по болезни 1-июнь-2014 1234 отпуска по болезни 2-Июнь-2014 1234 отпуска по болезни 3-Июнь-2014 1234 отпуска по болезни 4-Июнь-2014 1234 отпуска по болезни 5-Июнь-2014 Это рассматривается как один случай. Чтобы уточнить, что я подразумеваю под обращением: общее количество обращений — это количество запросов на отпуск… например: введите описание изображения здесьмне нужно получить следующую информацию с помощью инструкции SQL (например, я должен определить период: с 1 января 2014 года по 30 декабря 2014 года):

Обращений за отпуском по болезни: 2

Сопровождение оставленных обращений: 2

Случаи оставления исследований: 1

Я использую PostgreSQL 9.2.

Ответ №1:

Этот дизайн немного странный, из-за этих ежедневных рядов, если у одного и того же человека будет несколько листков сопровождения, то вам придется разбираться в разных случаях.

Для этого конкретного случая вы можете использовать что-то вроде этого

 SELECT COUNT(*), leavetype 
FROM (
  SELECT leavetype
  FROM Leaves
  GROUP BY employee_id, leavetype
)
GROUP BY leavetype;
 

Я предлагаю использовать даты case_start и case_end для одной строки обращения.

Ответ №2:

Возможно, вы можете попробовать это:

 select leave_type, count(*)
from (
  select employee_id, leave_type
  from leaves
  where date between ...
  group by employee_id, leave_type) t
group by leave_type;
 

Ответ №3:

 select LeaveType, count(EmployeeID) as TotalCases from(
select EmployeeID, LeaveType, count(LeaveType) as count_LeaveType 
from Leaves 
where Date BETWEEN '2007-02-01' AND '2007-02-31'; 
group by EmployeeID, LeaveType) as A
group by LeaveType, A.EmployeeID
 

Ответ №4:

Пожалуйста, найдите SQLFiddle ниже.

SQL СКРИПКА

 SELECT leave_type,COUNT(leave_type) FROM
(SELECT leave_type,count(leave_type)
FROM leaves 
WHERE Date BETWEEN '2014-01-01' AND '2014-12-31'
GROUP BY leave_type,emp_id) t
GROUP BY leave_type
 

Надеюсь, это решит вашу проблему.

Комментарии:

1. Спасибо за ответ: я все еще не уверен, учитывает ли ваш ответ следующее: обращение учитывается для последовательной группы дат (с одинаковым идентификатором и классом), а также учитывается для каждого «ID, Type amp; Date», если нет «ID, Type amp; Date 1», «ИДЕНТИФИКАТОР, тип и дата 2» … и т.д. ?

2. Извините, я не понял.

3. если у одного и того же человека будет несколько больничных листов, тогда я должен выяснить разные случаи. Я думаю, что ваше решение этого не учитывает, см. Ваш пример после того, как я добавил новую запись (новый случай) в последний: sqlfiddle.com /#!2/45b62/1

4. Из вашего вопроса я понял группу count(leaveType) по EmpID. Проверьте эту ссылку sqlfiddle.com /#!2/e603e5/1

5. Учтите, что последняя запись (в вашей последней ссылке) должна быть с идентификатором = 1234, тогда случаев отпуска по болезни должно быть 3, но по вашему результату все равно 2.

Ответ №5:

Я не уверен, как это будет сделано, PostgreSQL но в MySQL этом можно достичь, выполнив следующую команду :

ЗАПРОС

 SELECT  Leave type, count(Leave type) 
FROM Leave 
WHERE (Date BETWEEN  '2014-01-01' AND '2014-12-30' ) 
GROUP BY Leave type
 

Комментарии:

1. Это неправильное решение вопроса

2. Это сгруппирует все дни одного типа вместе в одну строку результата; не то, что хочет OP.