Количество зарегистрированных / проверенных сотрудников за день

Я работаю над веб-приложением на основе Spring MVC. Я реализовал графическое представление данных, актуальных для моего клиента. это очень просто. Мне нужно проиллюстрировать количество зарегистрированных сотрудников и проверенных сотрудников на ежедневной основе регистрации и проверки.

Я написал запрос ниже,

 SELECT monthyear 
                        ,SUM(CASE WHEN type='1' THEN total ELSE 0 END )as tot_ver 
                        ,SUM(CASE WHEN type='2' THEN total ELSE 0 END )as tot_reg   
                    FROM ( 
                          SELECT  
                            TO_CHAR(verify_date,'YYYY-mm-dd') as monthyear 
                            ,SUM(CASE WHEN verify_status=1  THEN 1 ELSE 0 END )as total 
                            ,'1' as type  
                            FROM EMPLOYEE 
                            GROUP BY TO_CHAR(verify_date,'YYYY-mm-dd')  
                        UNION ALL 
                         SELECT TO_CHAR(add_date,'YYYY-mm') as monthyear  
                         ,SUM(CASE WHEN emp_id!=0  THEN 1 ELSE 0 END )as total 
                         ,'2' as type 
                         FROM EMPLOYEE 
                        GROUP BY TO_CHAR(add_date,'YYYY-mm-dd') 
                       )  
                    where monthyear IS NOT NULL    
                    GROUP BY monthyear 
                 ORDER BY monthyear 

И КОД ЯВА

 public TwoValueBean totRegisterUser() {
        String query = " SELECT monthyear"
                + "         ,SUM(CASE WHEN type='1' THEN total ELSE 0 END )as tot_ver"
                + "         ,SUM(CASE WHEN type='2' THEN total ELSE 0 END )as tot_reg  "
                + "     FROM ("
                + "           SELECT "
                + "             TO_CHAR(verify_date,'YYYY-mm') as monthyear"
                + "             ,SUM(CASE WHEN verify_status=1  THEN 1 ELSE 0 END )as total"
                + "             ,'1' as type "
                + "             FROM EMPLOYEE"
                + "             GROUP BY TO_CHAR(verify_date,'YYYY-mm') "
                + "         UNION ALL"
                + "          SELECT TO_CHAR(add_date,'YYYY-mm') as monthyear "
                + "          ,SUM(CASE WHEN emp_id!=0  THEN 1 ELSE 0 END )as total"
                + "          ,'2' as type"
                + "          FROM EMPLOYEE"
                + "         GROUP BY TO_CHAR(add_date,'YYYY-mm')"
                + "        ) "
                + "     where monthyear IS NOT NULL   "
                + "     GROUP BY monthyear"
                + "  ORDER BY monthyear";
        MapSqlParameterSource param = new MapSqlParameterSource();
        TwoValueBean bean = new TwoValueBean();
        try {
            List<TotalRegisterGraphData> list = getNamedParameterJdbcTemplate().query(query, param, new RowMapper<TotalRegisterGraphData>() {

                @Override
                public TotalRegisterGraphData mapRow(ResultSet rs, int rowNo) throws SQLException {
                    TotalRegisterGraphData regData = new TotalRegisterGraphData();
                    regData.setRegMonth(rs.getString("monthyear"));
                    regData.setTotRegister(rs.getLong("tot_reg"));
                    regData.setTotVerify(rs.getLong("tot_ver"));
                    return regData;
                }
            });
            if (list != null && list.size() > 0) {
                String reqDate = "";
                List<String> val1 = new ArrayList<String>();
                List<String> val2 = new ArrayList<String>();
                List<String> val3 = new ArrayList<String>();
                int currentVer = 0;
                int currentReg = 0;
                for (TotalRegisterGraphData data : list) {
                    currentReg += data.getTotRegister();
                    currentVer += data.getTotVerify();
                    val1.add("'" +data.getRegMonth()+ "'");
                    val2.add(String.valueOf(currentReg));
                    val3.add(String.valueOf(currentVer));
                }
                bean.setVal1(StringProcessorUtil.arrayToString(val1.toArray(new String[]{}), null));
                bean.setVal2(StringProcessorUtil.arrayToString(val2.toArray(new String[]{}), null));
                bean.setVal3(StringProcessorUtil.arrayToString(val3.toArray(new String[]{}), null));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}

Как вы можете видеть, запрос извлекает данные от имени дня регистрации, но также следует отметить, что он суммирует счетчик, как только пользователь регистрируется, он показывает максимальное количество на определенную дату.

Что я хочу, мне нужно точное количество зарегистрированный сотрудник в определенный день.

Например: если 50 сотрудников будут зарегистрированы 24-11-2018, то счет будет показан как 50, а не 50 + все предыдущие регистрации.

Аналогичный случай возникает для проверенного сотрудника.

Регистрация - это первый этап (в запросе tot_reg содержит счет) Проверка - заключительный этап (в запросе tot_ver содержит счет)

Регистрацию можно получить по add_date. и подтверждение можно получить по verify_date.

Для большей ясности я также прикрепил графическое изображение n, на котором синими линиями показаны зарегистрированные сотрудники, а черными линиями показано количество проверенных сотрудников, но вы, люди, можете наблюдать, чем, оно показывает максимальное количество на конкретную дату. Количество зарегистрированных / проверенных сотрудников за день Например. если зарегистрирован 1 человек, то на 01-01-2018 отображается 1 если в следующие два дня зарегистрировалось еще 1 человек, то отображается 2 если 2 человека зарегистрировались 05.01.2018, то отображается 4

Я не хочу, чтобы это произошло, я хочу, чтобы количество зарегистрированных пользователей в день.

если 10 человек зарегистрировались 08.01.2018, то должно быть показано 10 если еще 20 человек зарегистрировались 09.01.2018, то отображается 20 аналогично для проверенного сотрудника

Рассмотрите возможность удаления тега SQL из этого вопроса

Caius Jard 23.11.2018 19:22
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш SQL-запрос возвращает данные, которые вы запрашиваете, то есть возвращает день (который вы ошибочно назвали месяцем) и количество сотрудников, зарегистрированных / проверенных в этот день.

Это ваш код Java, который накапливает счет

Измените это:

currentReg += data.getTotRegister();
currentVer += data.getTotVerify();

К этому:

currentReg = data.getTotRegister();
currentVer = data.getTotVerify();

Обратите внимание: похоже, в запросе есть ошибка:

SELECT TO_CHAR(add_date,'YYYY-mm') as monthyear --month precision, will give repeated rows
...
GROUP BY TO_CHAR(add_date,'YYYY-mm-dd') --day precision

И ваш запрос, вставленный в верхнее поле, не соответствует запросу в java-коде.

Охххкк, большое спасибо, но вам не кажется, что на каждой итерации я теряю предыдущие значения

user9634982 23.11.2018 19:44

Эмм. Это то, о чем вы просили?

Caius Jard 23.11.2018 19:50

ohkk, затем предложите мне решение, чтобы я мог отслеживать каждое свое значение за итерацию

user9634982 23.11.2018 20:26

иметь 4 переменные; 2 что делают ваши += и 2 что делают ваш =?

Caius Jard 23.11.2018 21:36

Другие вопросы по теме