powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка из выборки
13 сообщений из 13, страница 1 из 1
Выборка из выборки
    #39769303
Foxxtrott85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день форумчане
Подскажите, пожалуйста, как правильно сделать выборку в выборке
Есть первоначально 3 таблицы (STAFF, STAFF_REF,SUBDIV_REF) связь которых мне дают результат: отдел-> список сотрудников
Есть еще одна таблица (TABEL_INTERMEDIADATE), в которой регистрируется время прохода сотрудника через дверь с замком.
В таблице TABEL_INTERMEDIADATE за день по сотруднику может быть много записей, так как котрольных дверей, где он проходит много, сотрудник также может выходить и заходить в офис.
Задача: Для каждого отдела вывести список сотрудников с временем прихода и ухода с работы. Время прихода возьмем MIN() время из TABEL_INTERMEDIADATE по сотруднику, а время ухода соответственно MAX()

В примере я показываю только одну выборку в результате которой у меня получается ошибка использования MAX, MIN с агрегатными функциями, прошу направить в правильное русло и подсказать как правильно написать запрос в запросе
авторSELECT s.FULL_FIO AS "ФИО",
d.DISPLAY_NAME AS "Департамент", MIN(t.TIME_PASS) AS "Время прихода", MAX(t.TIME_PASS) AS "Время ухода", t.DATE_PASS
FROM STAFF s JOIN STAFF_REF r ON s.ID_STAFF=r.STAFF_ID JOIN SUBDIV_REF d ON r.SUBDIV_ID=d.ID_REF JOIN TABEL_INTERMEDIADATE t ON t.STAFF_ID=s.ID_STAFF
WHERE d.DISPLAY_NAME = 'АУП' AND t.DATE_PASS='2018-04-05'


исходные данные:
Иванов Иван Иванович АУП 7:34:55 2018-04-05
Иванов Иван Иванович АУП 8:15:55 2018-04-05
Иванов Иван Иванович АУП 11:34:55 2018-04-05
Иванов Иван Иванович АУП 11:55:55 2018-04-05
Иванов Иван Иванович АУП 15:00:00 2018-04-05
Иванов Иван Иванович АУП 16:33:22 2018-04-05
Иванов Иван Иванович АУП 16:44:11 2018-04-05
Иванов Иван Иванович АУП 17:01:55 2018-04-05
Иванов Иван Иванович АУП 17:13:55 2018-04-05

Результат должен быть таким:
Иванов Иван Иванович АУП 7:34:55 17:13:55 2018-04-05

Заранее всем спасибо за помощь
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769304
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
никому не говори версию сервера
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769308
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxxtrott85,

GROUP BY, не?
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769309
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxxtrott85,

Добрый полицейский.
Типа того:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT s.FULL_FIO AS "ФИО",
d.DISPLAY_NAME AS "Департамент", 
( select MIN(t.TIME_PASS) AS "Время прихода"
from TABEL_INTERMEDIADATE t
where t.STAFF_ID=s.ID_STAFF and  t.DATE_PASS='2018-04-05'
),
( select MAX(t.TIME_PASS) AS "Время ухода"
from TABEL_INTERMEDIADATE t
where t.STAFF_ID=s.ID_STAFF and  t.DATE_PASS='2018-04-05'
)
FROM STAFF s JOIN STAFF_REF r ON s.ID_STAFF=r.STAFF_ID JOIN SUBDIV_REF d ON r.SUBDIV_ID=d.ID_REF 
WHERE d.DISPLAY_NAME = 'АУП'


Индексы по дате надо построить и ascending и descending для скорости выполнения. Можно min() и мах() заменить на first с соответствующей сортировкой.
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769315
Foxxtrott85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий,
2.5
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769316
Foxxtrott85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI,

Спасибо большое!
то что нужно!

знаний не хватало реализовать =(
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769320
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.02.2019 16:37, Foxxtrott85 пишет:
> 2.5

ну, тогда есть простор для творчества...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769322
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxxtrott85,

индексы проверьте. STAFF_ID + DATE_PASS.
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769325
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI, а если сотрудник ушёл после полуночи?
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769328
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvait,

Тогда нужен индентификатор приход/уход. А если в базе СКУД вообще данные пропадают (так бывает, нужно программно их востанавливать)?
Я вообще в курсе СКУД. Там не всё так просто. Но пока ТС просит упрощённо.
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769465
doos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О_о, PERCo! Знакомая тема. Там вроде с событиями другая таблица, позже скажу, посмотреть надо.
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769474
doos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так мы вытаскиваем события за последние 5 часов
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	SELECT ID_REG, STAFF.TABEL_ID, CONTR.DISPLAY_NAME AS CONTROLLER, SOURCE.DISPLAY_NAME AS NAV, EVNAME.DISPLAY_NAME AS STATUS, REG_EVENTS.DATE_EV, REG_EVENTS.TIME_EV, number_auto.INFO_DATA AS number_auto, purpose_visit.INFO_DATA as purpose_visit, STAFF.LAST_NAME, STAFF.FIRST_NAME, STAFF.MIDDLE_NAME, STAFF.TEMPORARY_ACC, REG_EVENTS.IDENTIFIER, STAFF.ID_STAFF
	    FROM REG_EVENTS
	        JOIN STAFF ON STAFF.ID_STAFF = REG_EVENTS.STAFF_ID
	        JOIN CONFIGS_TREE CONTR ON CONTR.ID_CONFIGS_TREE = REG_EVENTS.CONFIGS_TREE_ID_CONTROLLER
	        JOIN CONFIGS_TREE SOURCE ON SOURCE.ID_CONFIGS_TREE = REG_EVENTS.CONFIGS_TREE_ID_RESOURCE
	
	        JOIN (
	                SELECT MODEL_EVENTS.INNER_NUMBER + MODEL_EVENTS.AUXCOEFFICIENT AS INNER_NUMBER, MAX(MODEL_EVENTS.DISPLAY_NAME) AS DISPLAY_NAME
	                FROM MODEL_EVENTS
	                GROUP BY MODEL_EVENTS.INNER_NUMBER + MODEL_EVENTS.AUXCOEFFICIENT
	                ) EVNAME
	        ON EVNAME.INNER_NUMBER = REG_EVENTS.INNER_NUMBER_EV
	         
	        LEFT JOIN STAFF_INFO_DATA_STR number_auto ON number_auto.STAFF_ID = REG_EVENTS.STAFF_ID and number_auto.REF_ID = 14
	        LEFT JOIN STAFF_INFO_DATA_STR purpose_visit ON purpose_visit.STAFF_ID = REG_EVENTS.STAFF_ID and purpose_visit.REF_ID = 231670
	        
	WHERE REG_EVENTS.DATE_EV + REG_EVENTS.TIME_EV between DATEADD(HOUR, -5, CURRENT_TIMESTAMP) and CURRENT_TIMESTAMP
	ORDER BY REG_EVENTS.DATE_EV + REG_EVENTS.TIME_EV DESC
...
Рейтинг: 0 / 0
Выборка из выборки
    #39769481
Foxxtrott85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья всем спасибо! Все помогли
Креатору отдельное спасибо, просто и понятно
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка из выборки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]