Надо создать отчет типа учет рабочего времени

Вопросы по программированию, не подходящие в другие разделы.

Модераторы: Naeel Maqsudov, C_O_D_E

Serafina
Сообщения: 11
Зарегистрирован: 16 ноя 2004, 22:13
Откуда: Питер
Контактная информация:

а какое тогда условие join-a?
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Блин. Похоже погорячился. Получается выбрать все пары, где время прихода меньше времени ухода (можно и без identity того же добиться), но вот пары типа

ВХОД ВЫХОД
8.00 18.01

явно лишние. Т.е. похоже без подзапроса не обойтись :(
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Злобный бред:

Код: Выделить всё

SELECT 

e1.card, 
e1.event_time,
e2.event_time


FROM events AS e1, events AS e2
WHERE 
e1.card=e2.card 
and e1.status =1
and e2.status =2
and e1.event_time < e2.event_time
and e2.event_time  not in  (select max  (event_time) from events e4 where  e4.card = e2.card)

union all 

SELECT 

e1.card, 
e1.event_time,
e2.event_time
FROM events AS e1, events AS e2
WHERE 
e1.card=e2.card 
and e1.status =1
and e2.status =2
and e1.event_time < e2.event_time
and e1.event_time not in  (select min (event_time) from events e3 where  e3.card = e1.card)
Даже самый дурацкий замысел можно воплотить мастерски
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

Главное, запретить всем приходить на работу больше двух раз в день :)
А join на саму себя, это хорошая мысль. Предлагаю так запрос:

Код: Выделить всё

SELECT e1.card, e1.event_time, min(e2.event_time)
FROM
(
  (SELECT * FROM events WHERE status=1) as e1  LEFT JOIN
  (SELECT * FROM events WHERE status=2) as e2  ON e1.card=e2.card
)
WHERE e1.event_time < e2.event_time
GROUP BY e1.card, e1.event_time
ORDER BY e1.card, e1.event_time
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Вся прелесть таких запросов будет ощущаться при выборке за год, и когда сотрудников за сотню перевалит.
Даже самый дурацкий замысел можно воплотить мастерски
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

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

Код: Выделить всё

SELECT card, (sum(iif(status=2, event_time, 0))-sum(iif(status=1, event_time, 0))) as worktime
FROM events
GROUP BY card
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

Ввести в таблицу events для каждого сотрудника запись со временем выхода, например, 01-01-3456 (т.е. дата, которая не наступит в обозримом будущем), и при выводе (или в самом SQL запросе) заменять ее на <пусто>.
Ответить