Вставить значение в следующий столбец, чтобы оно не совпадало с двумя предыдущими столбцами в таблице? - PullRequest
1 голос
/ 22 июня 2019

У меня есть таблица агента в базе данных. Структура выглядит следующим образом:

information(id,name,group) and 12 columns containing months values(month1,month2,....).

Изображения таблиц прилагаются. Каждый месяц должен назначаться оценщик для соответствующего агента. У меня есть 21 оценщик и оценочная таблица, как:

(Id(EvaluatorId), Group(to which he belongs),Quantity(how many times he can be assigned to agent)) 

Итак, проблема, с которой я сталкиваюсь, заключается в том, что я не могу назначить их все. Я думаю, что есть проблема с моим SQL-запросом, который выбирает случайно не назначенного агента из таблицы агентов.

Таблица агентов:
enter image description here
Оценочная таблица:
enter image description here

Вот что я написал в своей части API:

 List<Integer> results=new ArrayList<>();

        List<Evaluation> evaluations= evaluationRepository.findTop1000ByOrderByEvaluatorAsc();
        for (Evaluation evaluation : evaluations) {

                for (int i = 0; i < evaluation.getQuantity(); i++) {

                    Agent agent=AgentRepository.getNotAssignedAgent(evaluation.getGroup(),LocalDate.now().getMonthValue(),evaluation.getEvaluator());

                    System.out.println(agent.getId()+" : "+evaluation.getGroup()+" : "+evaluation.getEvaluator());
                    results.add((int)agent.getId());
                    AgentRepository.updateAgent((int)agent.getId(),LocalDate.now().getMonthValue(),evaluation.getEvaluator());
                }
            return results;

        }


Способ получения неназначенного агента из таблицы Agent в AgentRepository:

 public Agent getNotAssignedAgent(int groupType,int monthId,int evaluator) {
        String sql="Select TOP(1) Id,Agent,GroupType From [AgentAllocator].[dbo].[Agent] Where GroupType="+groupType+" AND ["+ monthId +"] is null AND ( ["+(monthId-1)+"] <>"+evaluator+" Or "+(monthId-1)+" is null ) AND ( ["+(monthId-2)+"] <>"+evaluator+" Or "+(monthId-2)+" is null ) Order by rand()";
        Agent agent=new Agent();
        try{
            Statement statement=connection.createStatement();
            ResultSet resultSet=statement.executeQuery(sql);
            while (resultSet.next()) {
                agent.setAgent(resultSet.getString(2));
                agent.setGroupType(Integer.parseInt(resultSet.getString(3)));
                agent.setId(Integer.parseInt(resultSet.getString(1)));
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return agent;
    }

Пример запроса:

Select TOP(1) Id,Agent,GroupType From [AgentAllocator].[dbo].[Agent] Where GroupType=1 AND [6] is null AND ( [5] <>21 Or [5] is null ) AND ( [4] <>21 Or [4] is null ) Order by rand();

Способ обновления таблицы агентов в AgentRepository:

 @Override
    public int updateAgent(int agentId,int month, int value){
        String sql="Update [AgentAllocator].[dbo].[Agent] set ["+month+"] ="+value+" WHERE Id="+agentId;
        int res=-100;
        try{
            Statement statement=connection.createStatement();
            res=statement.executeUpdate(sql);
        }catch(Exception e){
            e.printStackTrace();
        }
        return  res;
    }

Мой ожидаемый результат: все оценщики в таблице оценки должны быть назначены агенту. Никого не должно быть. Есть 311 агентов и 21 оценщик, которые должны быть назначены 283 раза.
Когда я запускаю API, я получаю 241 агента из 283.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...