Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / запрос в базе Perco / 25 сообщений из 36, страница 1 из 2
03.06.2014, 11:29:14
    #38659746
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Всем привет. Такая ситуация: На проходной стоит СКД с базой на скуле. Все события складываются в одну таблицу- где различие между входом и выходом-цифра. Сейчас встал вопрос как получить выборку такого плана: табномер сотрудника, дата входа и дата выхода, например:

сейчас:
111 Иванов 03.06.2014 1(1-признак входа)
111 Иванов 03.06.2014 1(2-признак выхода)
нужно:
111 Иванов 03.06.2014 03.06.2014


это при условии что может быть как вход без выхода так и выход без входа (на машине заехали) так и несколько раз вход и выход за день.

пытаюсь делать так:

select s.last_name,s.first_name,s.middle_name,s.tabel_id,
t.date_pass,t.time_pass,t.type_pass
from tabel_intermediadate t,staff s
where s.id_staff=t.staff_id and s.tabel_id <>''
and t.type_pass in (1,2)

опять же появляются два строчки....что делать?
...
Рейтинг: 0 / 0
03.06.2014, 11:39:54
    #38659770
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
так, опишу таблицы для удобства:
staff-данные о сотруднике
tabel_intermediadate-события

между собой они связаны по полю staff.id_staff=tabel_intermediadate.staff_id
в tabel_intermediadate есть поле type_pass(1-вход,2-выход)
...
Рейтинг: 0 / 0
03.06.2014, 12:24:19
    #38659862
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчикs.id_staff=t.staff_id"...чтобы запутать противника!"

Тильчикопять же появляются два строчки....что делать?

Код: sql
1.
2.
3.
4.
5.
6.
7.
select s.last_name,s.first_name,s.middle_name,s.tabel_id,t.date_pass
 ,min(case when t.type_pass=1 then t.time_pass) as time_in
 ,max(case when t.type_pass=2 then t.time_pass) as time_out
from tabel_intermediadate t
join staff s on s.id_staff=t.staff_id 
where s.tabel_id <>''  and t.type_pass in (1,2)
group by 1,2,3,4,5
...
Рейтинг: 0 / 0
03.06.2014, 13:45:23
    #38660024
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчик решил формально выполнить этикет:)

ЗЫ
хочу сварить суп, пытаюсь делать так - закинул картошку морковку и кусок мяса в кастрюлю, варю - вместо супа получилось 4 свареные картошки, одна марковка, и кусок мяса, что делать?
...
Рейтинг: 0 / 0
03.06.2014, 14:09:51
    #38660073
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
не канает
...
Рейтинг: 0 / 0
03.06.2014, 14:11:18
    #38660077
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
alex564657498765453,да, приходится))))в скуле не силен а нужно именно запросом чтобы потом резльтат не обрабатывать...
...
Рейтинг: 0 / 0
03.06.2014, 15:09:28
    #38660209
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчик,

а что у вас за СУБД?
...
Рейтинг: 0 / 0
03.06.2014, 15:10:31
    #38660213
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
tanglir
Код: sql
1.
2.
3.
4.
5.
6.
7.
select s.last_name,s.first_name,s.middle_name,s.tabel_id,t.date_pass
 ,min(case when t.type_pass=1 then t.time_pass) as time_in
 ,max(case when t.type_pass=2 then t.time_pass) as time_out
from tabel_intermediadate t
join staff s on s.id_staff=t.staff_id 
where s.tabel_id <>''  and t.type_pass in (1,2)
group by 1,2,3,4,5

Безотносительно логики запроса - case-ы не закрыты.
...
Рейтинг: 0 / 0
03.06.2014, 15:37:08
    #38660264
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
miksoft, птичка, aka firebird

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
03.06.2014, 16:00:02
    #38660301
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
недописать "end" это такой хитрый тест для ТС-а на профпригодность? :)
...
Рейтинг: 0 / 0
04.06.2014, 10:21:24
    #38661029
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
end то я сам написал))) только выполняется долго:(
...
Рейтинг: 0 / 0
04.06.2014, 10:22:27
    #38661032
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
да и выборка неверно работает
...
Рейтинг: 0 / 0
04.06.2014, 10:33:45
    #38661050
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчик,

а что бы тебе помочь нужна DDL таблиц, немного данных и желаемый результат
ЧИТАТЬ__ВСЕМ,__КТО__ПРИШЕЛ__СЮДА__В__ПЕРВЫЙ__РАЗ!
...
Рейтинг: 0 / 0
04.06.2014, 11:15:22
    #38661108
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчик,

держи гранату

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
WITH T AS (
  SELECT
    DISTINCT
    STAFF_ID AS STAFF_ID,
    CASE
      WHEN TYPE_PASS = 1
      THEN DATE_PASS
    END AS DATE_IN,
    CASE
      WHEN LEAD(TYPE_PASS) OVER(PARTITION BY STAFF_ID ORDER BY DATE_PASS) = 2
      THEN LEAD(DATE_PASS) OVER(PARTITION BY STAFF_ID ORDER BY DATE_PASS)
    END AS DATE_OUT
  FROM TABEL_INTERMEDIADATE
  WHERE TYPE_PASS IN (1, 2)
)
SELECT
    S.LAST_NAME,
    S.FIRST_NAME,
    S.MIDDLE_NAME,
    S.TABEL_ID,
    T.DATE_IN,
    T.DATE_OUT
FROM T
   JOIN STAFF S ON S.ID_STAFF = T.STAFF_ID
WHERE S.TABEL_ID <> ''
...
Рейтинг: 0 / 0
04.06.2014, 11:15:28
    #38661109
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
а, нет, вру, все отлично, спасибо
...
Рейтинг: 0 / 0
04.06.2014, 11:17:33
    #38661110
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчик,

вообще то в исходном запросе он покажет первый вход и последний выход. Если промежуточные не нужны то тогда верно
...
Рейтинг: 0 / 0
04.06.2014, 11:58:14
    #38661175
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Симонов Денис,

а если несколько раз зашел и вышел?
...
Рейтинг: 0 / 0
04.06.2014, 12:03:30
    #38661181
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Симонов Денис,
...
Рейтинг: 0 / 0
04.06.2014, 12:07:10
    #38661190
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
этот запрос будет работать только в FB 3 и выше. Но он ещё в состоянии пре беты.
Для 2.5 подобное написать будет сложновато, но можно с помощью EXECUTE BLOCK или ХП.
А у вас какая версия?
...
Рейтинг: 0 / 0
04.06.2014, 12:08:37
    #38661193
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчик,

большая просьба перестать сюда фигачить скриншоты IBE. Лучше писать только тексты ошибок
...
Рейтинг: 0 / 0
04.06.2014, 12:09:22
    #38661195
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Симонов Денис,

просто хотелось показать на какой строчке ругается, птичка у нас 2.5 стоит
...
Рейтинг: 0 / 0
04.06.2014, 12:14:09
    #38661203
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Симонов Денис,

поможешь? очень нужно....
...
Рейтинг: 0 / 0
04.06.2014, 12:16:22
    #38661206
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Тильчик,

ты скажи чего тебе нужно поточнее. Мой запрос вытаскивает на каждый вход выход, если он конечно был.

Вот вариант без оконных функций

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
WITH T AS (
  SELECT
    DISTINCT
    STAFF_ID AS STAFF_ID,
    CASE
      WHEN TYPE_PASS = 1
      THEN DATE_PASS
    END AS DATE_IN,
    (SELECT TI_2.DATE_PASS
     FROM
       TABEL_INTERMEDIADATE TI_2
     WHERE TI_1.STAFF_ID = TI_2.STAFF_ID AND
           TI_2.TYPE_PASS = 2
           TI_2.DATE_PASS >= TI_1.DATE_PASS
     ORDER BY DATE_PASS
     ROWS 1) AS DATE_OUT
  FROM TABEL_INTERMEDIADATE TI_1
  WHERE TYPE_PASS IN (1, 2)
)
SELECT
    S.LAST_NAME,
    S.FIRST_NAME,
    S.MIDDLE_NAME,
    S.TABEL_ID,
    T.DATE_IN,
    T.DATE_OUT
FROM T
   JOIN STAFF S ON S.ID_STAFF = T.STAFF_ID
WHERE S.TABEL_ID <> ''



но он будет не быстрый
...
Рейтинг: 0 / 0
04.06.2014, 12:23:00
    #38661214
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
Симонов Денис,
мне нужны данные когда человек зашел и когда вышел учитывая то, что он несколько раз заходил и выходил и может быть такая ситуация что может быть как вход без выхода так и выход без входа
...
Рейтинг: 0 / 0
05.06.2014, 07:49:36
    #38662132
Тильчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос в базе Perco
нет ни кого мыслей?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / запрос в базе Perco / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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