Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос - шахматка по дням и часам / 12 сообщений из 12, страница 1 из 1
27.04.2016, 12:03
    #39225469
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
Есть простая таблица:
СотрудникДатаВремяНачРаботыВремяОкончРаботыИванов01/04/201607:0018:00Петров02/04/201607:0018:00Сидоров01/04/201600:0009:00[/CSV]

Нужна идея (подход) - Как построить шахматку (за месяц):
В строках: Дата ,
в Колонках: Часы (от 00 до 23),
В области данных: количество работавших сотрудников.

Дата00-0101-02...08-09...23-0001/04/201611...2...002/04/201600...1...0
...
Рейтинг: 0 / 0
27.04.2016, 12:11
    #39225477
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
перекрёстный запрос. Можно даже мастером построить.
...
Рейтинг: 0 / 0
27.04.2016, 12:29
    #39225488
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
Akina,
Часы как разобрать?
...
Рейтинг: 0 / 0
27.04.2016, 12:39
    #39225501
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
Создать опорную таблицу часов и сделать "раскидку" исходных данных по попаданию в диапазон опорной таблицы.
...
Рейтинг: 0 / 0
27.04.2016, 12:48
    #39225510
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
Akina,

Если делать опорную таблуцу и "раскидку", то и перекрестный запрос не нужен.
...
Рейтинг: 0 / 0
27.04.2016, 13:11
    #39225537
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
MikeLedЕсть простая таблица:
СотрудникДатаВремяНачРаботыВремяОкончРаботыИванов01/04/201607:0018:00Петров02/04/201607:0018:00Сидоров01/04/201600:0009:00[/CSV]

Нужна идея (подход) - Как построить шахматку (за месяц):
В строках: Дата ,
в Колонках: Часы (от 00 до 23),
В области данных: количество работавших сотрудников.

Дата00-0101-02...08-09...23-0001/04/201611...2...002/04/201600...1...0
Какой тип данных поля "ВремяНачРаботы" и "ВремяОкончРаботы"?
База какая? В смысле: Access, SQL Server, Oracle?
Если база не Access, то лучше всего запрос к серверу.
...
Рейтинг: 0 / 0
27.04.2016, 13:12
    #39225539
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
Да, раскидку можно сделать и без опорной таблицы и перекрёстного запроса, чисто пачкой из 24 IIF-ов... и даже работать будет. Хочешь - делай так.
А вот опорная таблица дат (статическая или динамическая) - тебе в любом случае понадобится.
...
Рейтинг: 0 / 0
27.04.2016, 13:18
    #39225546
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
studieren,

База Access
Тип данных полей "ВремяНачРаботы" и "ВремяОкончРаботы": Дата/Время
...
Рейтинг: 0 / 0
27.04.2016, 13:24
    #39225558
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
А вообще текст запроса будет выглядеть примерно так:
Код: 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.
30.
SELECT
    Дата,
    SUM(IIf(0 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [00-01],
    SUM(IIf(1 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [01-02],
    SUM(IIf(2 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [02-03],
    SUM(IIf(3 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [03-04],
    SUM(IIf(4 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [04-05],
    SUM(IIf(5 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [05-06],
    SUM(IIf(6 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [06-07],
    SUM(IIf(7 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [07-08],
    SUM(IIf(8 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [08-09],
    SUM(IIf(9 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [09-10],
    SUM(IIf(10 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [10-11],
    SUM(IIf(11 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [11-12],
    SUM(IIf(12 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [12-13],
    SUM(IIf(13 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [13-14],
    SUM(IIf(14 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [14-15],
    SUM(IIf(15 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [15-16],
    SUM(IIf(16 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [16-17],
    SUM(IIf(17 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [17-18],
    SUM(IIf(18 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [18-19],
    SUM(IIf(19 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [19-20],
    SUM(IIf(20 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [20-21],
    SUM(IIf(21 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [21-22],
    SUM(IIf(22 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [22-23],
    SUM(IIf(23 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [23-00]
FROM Таблица
WHERE >>Здесь лучше всего фильтровать данные<<
GROUP BY Дата
ORDER BY Дата;



Только сразу предупреждаю, что если "ВремяНачРаботы" и "ВремяОкончРаботы" разные даты (т.е. ночная смена: человек пришёл 21:00, а ушёл скажем 4:00 утра следующего дня), то запрос слегка будет врать. Такие случае надо будет чуть-чуть по другому обработать.
...
Рейтинг: 0 / 0
27.04.2016, 13:29
    #39225566
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
studierenесли "ВремяНачРаботы" и "ВремяОкончРаботы" разные датыНу вообще-то структура предполагает, что такого нет (т.е. ВремяНачРаботы<=ВремяОкончРаботы), а такого рода факт формирует две записи с разными датами, иначе струтура просто кривая.
Да и вообще неясно, нафига надо было рубить дату-время на две части.
...
Рейтинг: 0 / 0
27.04.2016, 13:47
    #39225592
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
Вот, все делают SUM через IIf.
А я почему-то никогда так не делаю...
Код: sql
1.
2.
3.
4.
5.
6.
7.
..............................................
    -SUM(0 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы)) AS [00-01],
    -SUM(1 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы)) AS [01-02],
    -SUM(2 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы)) AS [02-03],
    -SUM(3 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы)) AS [03-04],
    -SUM(4 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы)) AS [04-05],
..............................................
...
Рейтинг: 0 / 0
27.04.2016, 15:55
    #39225824
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос - шахматка по дням и часам
Только сразу предупреждаю, что если "ВремяНачРаботы" и "ВремяОкончРаботы" разные даты (т.е. ночная смена: человек пришёл 21:00, а ушёл скажем 4:00 утра следующего дня), то запрос слегка будет врать. Такие случае надо будет чуть-чуть по другому обработать.
Это понятно. И изначально было по постановке 21-24 & 00-04. (не мною придумано, прошу не обсуждать.)

Суть с If-ами мне понятна. Спасибо. Честно скажу - хотел этого избежать
И еще одно замечание (на всякий случай).
Условие IIF д.б. не совсем такое.

Код: sql
1.
    SUM(IIf(0 BETWEEN DatePart("h", ВремяНачРаботы) AND DatePart("h", ВремяОкончРаботы), 1, 0)) AS [00-01]


Время в Access стандартно не имеет значения 24:00, т.е. если сотрудник работает с 19:00 до 24:00, то записано это будет как с 19:00 до 00:00 (по логике д.б. дата следующего дня), т.е. где-то появятся лишние записи.
Видимо BETWEEN тут не подойдет. По крайней мере в таком виде.

Кстати, согласен с __Michelle - от IIF можно отказаться.

Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос - шахматка по дням и часам / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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