Страница 2 из 2

Добавлено: 18 ноя 2004, 18:04
Serafina
а какое тогда условие join-a?

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

ВХОД ВЫХОД
8.00 18.01

явно лишние. Т.е. похоже без подзапроса не обойтись :(

Добавлено: 18 ноя 2004, 18:44
AiK
Злобный бред:

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

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)

Добавлено: 19 ноя 2004, 16:16
chur
Главное, запретить всем приходить на работу больше двух раз в день :)
А 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

Добавлено: 19 ноя 2004, 19:48
AiK
Вся прелесть таких запросов будет ощущаться при выборке за год, и когда сотрудников за сотню перевалит.

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

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

SELECT card, (sum(iif(status=2, event_time, 0))-sum(iif(status=1, event_time, 0))) as worktime
FROM events
GROUP BY card

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