#sql-server
#sql-server
Вопрос:
Я пытаюсь написать команду для создания расписаний для сотрудников с различными рабочими адресами. Существует ряд местоположений, каждое из которых должно быть посещено один раз (одним сотрудником) в течение определенного периода.
Для начала я создал всего две таблицы: address_availability (столбцы avail_date и address) и employee_availability (столбцы avail_date и name)
Чтобы получить список всех возможных мест размещения, я просто выбираю адрес и имена сотрудников из двух таблиц и объединяю их по дате. В качестве примера вывода я получаю
London, Thomas, 27/05/2019
London, Thomas, 28/05/2019
Glasgow, Thomas, 27/05/2019
London, Mary, 27/05/2019
Glasgow, Mary, 27/05/2019
Мне нужно сделать так, чтобы не было конфликтов в расписании, т. Е. если Томасу предложено вылететь в Лондон 27-го, он не может быть в Глазго 27-го.
Я также хотел бы, чтобы команда выдавала максимум 5 результатов на сотрудника и не предлагала двух сотрудников на одно и то же место в одну и ту же дату.
Я не совсем уверен, что использую правильный инструмент для этой работы. Выполнимо ли это в SQL?
Комментарии:
1. Я не уверен, что SQL Server является подходящим инструментом для такого рода работы. Обычно с этим справляется приложение; поскольку это будет (очень вероятно) итеративный процесс, который после подтверждения будет записан обратно в базу данных.
2. Идея заключалась в том, чтобы просто перевести выходные данные в электронную таблицу. Попытки реализовать это в приложении на самом деле не оправданы, учитывая, как часто оно будет использоваться, поэтому я мог бы просто вернуться к выполнению этого вручную, если нет какого-либо готового приложения, которое обрабатывает такого рода вещи.
3. Жаль, я бы с удовольствием посмотрел, что мог бы создать здесь один из твердолобых (100k ) … 🙂 Я думаю, что это отличный вопрос в любом случае.
4. Даже просто ради любопытства или для будущего приложения, где требуется неконфликтный результат, было бы интересно
Ответ №1:
Если вы готовы перенести это в электронную таблицу, я бы использовал СВОДНЫЙ запрос https://learn.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017 ) для получения данных в формате
LOCATION TIME Thomas Mary
London 27/05/2019 1 1
Glasgow 27/05/2019 1 1
London 28/05/2019 1 0
Итак, из приведенной выше таблицы вы можете видеть, что 27-го числа Мэри и Томас могут оба выполнять либо то, либо другое, но 28-го числа доступен только Томас.
Что касается создания списка, вы можете использовать этот скрипт дальше, выполнив цикл, и там, где есть только один вариант, взяв его (а затем удалив этого человека на этот день) и выполнив цикл снова. В зависимости от сложности вы скоро достигнете пределов, когда у вас есть 2 варианта, и вам просто нужно выбрать один.
Это также при том понимании, что всегда есть решение, вы не разместили полные требования и т.д., Чтобы предложить это.