在下一列中插入值,使其与表中的前两列不匹配?

时间:2019-06-22 06:30:42

标签: java sql sql-server algorithm

我在数据库中有一个Agent表。结构如下:

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;

        }


从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中的Agent表的方法:

 @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;
    }

我的预期结果是:评估表中的所有评估者都应分配给代理。没有人应该离开。应分配283次的311名特工和21名评估员。
运行该api时,我从283个代理中分配了241个代理。

0 个答案:

没有答案