#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
ниже.
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.