powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос - шахматка по дням и часам
12 сообщений из 12, страница 1 из 1
Запрос - шахматка по дням и часам
    #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
Запрос - шахматка по дням и часам
    #39225477
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перекрёстный запрос. Можно даже мастером построить.
...
Рейтинг: 0 / 0
Запрос - шахматка по дням и часам
    #39225488
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Часы как разобрать?
...
Рейтинг: 0 / 0
Запрос - шахматка по дням и часам
    #39225501
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создать опорную таблицу часов и сделать "раскидку" исходных данных по попаданию в диапазон опорной таблицы.
...
Рейтинг: 0 / 0
Запрос - шахматка по дням и часам
    #39225510
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Если делать опорную таблуцу и "раскидку", то и перекрестный запрос не нужен.
...
Рейтинг: 0 / 0
Запрос - шахматка по дням и часам
    #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
Запрос - шахматка по дням и часам
    #39225539
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, раскидку можно сделать и без опорной таблицы и перекрёстного запроса, чисто пачкой из 24 IIF-ов... и даже работать будет. Хочешь - делай так.
А вот опорная таблица дат (статическая или динамическая) - тебе в любом случае понадобится.
...
Рейтинг: 0 / 0
Запрос - шахматка по дням и часам
    #39225546
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
studieren,

База Access
Тип данных полей "ВремяНачРаботы" и "ВремяОкончРаботы": Дата/Время
...
Рейтинг: 0 / 0
Запрос - шахматка по дням и часам
    #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
Запрос - шахматка по дням и часам
    #39225566
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenесли "ВремяНачРаботы" и "ВремяОкончРаботы" разные датыНу вообще-то структура предполагает, что такого нет (т.е. ВремяНачРаботы<=ВремяОкончРаботы), а такого рода факт формирует две записи с разными датами, иначе струтура просто кривая.
Да и вообще неясно, нафига надо было рубить дату-время на две части.
...
Рейтинг: 0 / 0
Запрос - шахматка по дням и часам
    #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
Запрос - шахматка по дням и часам
    #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
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос - шахматка по дням и часам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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